一、HTTP的情况
由于HTTP是明文传输,代理服务器可以从报文中拿到目标IP和端口号。因此,代理服务器收到客户端的HTTP请求后,会重新创建Request请求,并发送到目标服务器。当目标服务器返回Response给代理后,代理会对Response进行解析,然后重装Response发给客户端。
下图为HTTP请求没经过代理和经过代理的抓包数据情况:

1、请求头的信息是GET / HTTP/1.1 。是一个不完整的URL;
2、ip地址为源ip地址和目标ip地址;

1、请求头的信息是GET http://huaban.com/ HTTP/1.1 。是一个完整的URL。
2、ip地址为代理服务器的ip地址;
二、HTTPS的情况
由于HTTPS是加密数据包,代理服务器在没有密钥的情况下是无法解密的,无法知道目标ip地址和端口号。因此,要能正常代理则需使用CONNECT的隧道。
客户端向代理发起CONNECT时,就是告诉代理,先在代理和目标服务器之间建立起连接。在连接建立后,代理会返回一个连接就绪的报文给客户端。(状态码为200,状态码信息为Connection Established)。在此之后,客户端跟目标服务器的所有通信将使用之前建立起来的连接进行通信。在这种情况下,代理仅仅实现盲转发,而不会去关心转发的数据。
下图为HTTPS请求没经过代理的抓包数据情况:

由于是HTTPS请求,没有证书,无法解析对应的数据。因此,只能抓取到TCP流。
下图为HTTPS请求经过代理的抓包数据情况:

1、从抓包数据可以看到,先建立一个CONNECT请求,连接建立后再进行SSL握手;
2、CONNECT发起请求时,请求头:CONNECT 涂掉www.baidu.com:443 HTTP/1.1
这时候请求头已经不是HTTPS了,而是换成CONNECT。紧跟着的URL是代理服务器的信息(涂掉)拼接上目标域名。从目标域名后面的443端口号可以看出使用的是HTTPS协议;
3、响应头:HTTP/1.1 200 Connection Established
状态码200表示请求成功,状态码信息为Connection Established说明这是一个CONNECT请求;
4、响应报文中多了Proxy-Connection字段,表明经过代理;
5、Host: 涂掉www.baidu.com:443
6、Request Method: CONNECT
网友评论