Http协议之CONNECT方法

背景:

        无意间发现自己的Fiddler有大量的Tunnel To 的host,遂产生了好奇心,点开了这个session查看一番,发现在Fiddler的详细的请求报文中和我们常见的GETPOST方法的报文很是不同,这是为什么呢?以前从来没见过,或者说,对于HTTP协议不熟的人来说,可能大部分人都不曾用过或者见过这个请求。如下:
在这里插入图片描述
在截图的右边的报文部分(如下)我们可以看到这个报文与我们通常使用的GET报文很相似,但是也有两点不同:

CONNECT blog.csdn.net:443 HTTP/1.1
Host: blog.csdn.net:443
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
  1. 方法:CONNECT
    这个方式其实是HTTP/1.1的方法,在日常的开发中较少用到,我们下边会详细讲解。
  2. path内容:host:port
    通常的HTTP报文的方法后边的一段PATH路径,是我们通常的URI部分的,但是这个报文的PATH部分是一个HOST:PORT

以上两点,可见,同为HTTP方法之一,但是这个方法的用处可跟别的方法用处有很大的不同,接下来,详细介绍一下这个方法。

CONNECT 方法

摘一段MDN对于该方法的介绍:

        在 HTTP 协议中,CONNECT 方法可以开启一个客户端与所请求资源之间的双向沟通的通道。它可以用来创建隧道(tunnel)。

       例如,CONNECT 可以用来访问采用了 SSL (en-US) (HTTPS) 协议的站点。客户端要求** 代理 **服务器将 TCP 连接作为通往目的主机隧道。之后该服务器会代替客户端与目的主机建立连接。连接建立好之后,代理服务器会面向客户端发送或接收 TCP 消息流。

       CONNECT 是一个应用范围为点到点的方法。

重点:
       隧道:Tunnel
       代理: Proxy

       在我们开发普通应用的时候,涉及到HTTP服务器的请求,通常都会使用代理的方式,原因嘛,可能基于保护服务器(通常是 服务器反向代理),或者用户的受限,比如只能通过公司网关访问网络(通常是正向代理),但是这两种通常我们都归于 普通代理的范畴,就是有一个代理服务器作为中间商,拿到数据包,解析http数据包,然后代为转发一个http请求。
        于此不同的是,我们的Tunnel-proxy 隧道代理。和普通代理的应用层协议不同的是:隧道代理使用TCP协议

       通过Web代理服务器使用隧道方式传输基于TCP的协议,隧道代理通过HTTP协议正文部分(Body)完成通讯,以HTTP的方式实现任意基于TCP的应用层协议的代理。

       隧道代理使用HTTP的CONNECT方法建立连接,但CONNECT最开始并不是RFC 2616 - HTTP/1.1的一部分,直到2014年发布的HTTP/1.1修订版中,才增加了对CONNECT以及隧道技术的描述。

       隧道代理原理:HTTP客户端通过CONNECT方法请求隧道代理创建一条到达任意目标服务器和端口的TCP连接,并对客户端和服务端之间的后续数据进行盲转发。
隧道代理示意图

       为确保数据通信安全,浏览器与服务器之间的HTTPS通信是加密的。当浏览器需要通过代理服务器发送HTTPS请求时,由于请求的站点地址和段都都是加密保存于HTTPS请求头中的,代理服务器是如何既确保通信是加密的(代理服务器自身无法读取通信内容)又知道向哪里发送请求呢?
       为了解决这个问题,浏览器需先通过明文HTTP形式向代理服务器发送一个CONNECT请求告诉它目标站点的地址和端口。
       对于CONNECT连接来说,只是用来让代理创建TCP连接,所以只需要提供服务器域名和端口即可,并不需要具体的资源路径
       浏览器建立到服务器TCP连接产生的HTTP往返完全是明文的,这也是为什么CONNECT请求只需要提供IP和端口。若发送完整的URL、Cookie等信息会被中间人一览无余,降低了HTTPS的安全性。
       当代理服务器接收到这个请求后,会在对应的端口上与目标站点建立一个TCP连接,连接建立成功后返回一个HTTP 200状态码告诉浏览器与该站点的加密通道已经建立完成。
       浏览器接收到响应报文后,即可认为到服务端的TCP连接已经打通,后续直接往这个TCP连接写协议数据即可。

       接下来 代理服务器仅仅是来回传送浏览器与目标服务器之间的加密数据包,代理服务器并不需要解析加密内容以保证HTTPS的安全性

也就是说,当我们说使用CONNECT方法,在 客户端 < = > 代理 < = > 服务器 代理在两端中间建立了一个 Tunnel ,该代理服务器只维护 代理到服务器的 TCP连接,并直接转发数据包,并不做拆包解析等处理。

       而后,当TCP连接建立之后 ,客户端获取到TCP连接,我们可以在此TCP连接中进行HTTP报文的发送,此时我们访问应用服务器的HTTP报文就可以使用我们平时使用的GET或POST报文,但是 host依然是我们的代理服务器的地址,因为代理服务器已经映射了此TCP连接到服务器的TCP连接,所有通过该TCP连接的请求都会转发至应用服务器。

CONNECT 语法

报文格式:

CONNECT server.example.com:80 HTTP/1.1
Host: proxy.example.com:80
Proxy-Authorization: basic *

Host:代理服务器的host:port
PATH:服务器地址 。IP:port 用于代理服务器和应用服务器建立TCP连接
Proxy-Authorization: 用于代理服务器验证使用。 * 为 name:password ,然后经过base64编码 ,参考:Proxy-Authorization

实例:

CONNECT https://www.jianshu.com/u/f67233ce6c0c:80 HTTP/1.1
Host: www.web-tinker.com:80
Proxy-Connection: Keep-Alive
Proxy-Authorization: Basic YWJjOjEyMw==
Content-Length: 0

参考:HTTP CONNECT
CONNECT-HTTP|MDN

  • 9
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值