一文带你掌握http正向代理

241 阅读3分钟

提到代理我们首先想到的是nginx反向代理,没错nginx作为后端服务的反向代理在基于http服务中非常常见,而我要讲的是http的正向代理和Nginx反向代理不一样,我们先看一下正向代理和反向代理的定义。

正向代理

正向代理是一个位于客户端和目标服务器之间的代理服务器。为了从原始服务器取得内容,客户端向代理服务器发送一个请求并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特别的设置才能使用

反向代理

反向代理正好相反。对于客户端来说,反向代理就好像目标服务器。并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求结果转交给客户端,使得这些内容就好似他自己一样,客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就可以。

我们重点说明一下上面提到的特殊设置是指什么

对于正向代理来说这个特殊设置就是要告诉服务器我真正要访问的目的地址是什么,我们如何才能做到呢我们看通用的两种代理方式,对于这个特殊处理标准上有两种处理方式。

1、基于http(s)代理

当使用http发起正向代理请求需要先做一个特殊设置这个特殊设置就是发起CONNECT请求告诉代理服务器我真实的目的地址是什么。

为了弄清楚原理我们要用wiresahrk抓包来看一下

图片.png

这里我们能看到有一个HTTP请求信息是CONNECT 后面带有域名和端口所以这个特殊处理就是CONNECT请求,CONNECT请求告诉我们的目的地址和端口。

2、基于socks代理

当使用socks建立代理和HTTP代理机制有相似之处只是由HTTP协议变成了socks5协议。

我们继续用wireshark抓包看一下请求内容

图片.png

我们同样看到在socks协议中command命令有Connect命令这里我们就不难理解了,从Http(s)代理到socks代理实际使用的方式是非常类似的。

我们总结一下

首先要实现正向代理的客户端无论通过哪种方式都要告诉服务器我们的目标地址(目标域名)和端口是多少,让服务器去和目标主机建立连接通道,之后我们在基于这个通道做数据传输。

http(s)代理与socks5代理对于客户端协议的特殊处理

  • http(s)代理在客户端请求时不需要替换HTTP协议编解码处理这对于客户端编解码工作处理非常友好。

  • socks代理需要在socks建立连接成功后替换当前连接通道的编解码器,也就是说我们先使用socks编解码器处理socks代理握手协商,当socks5代理协商完成后再替换成http编解码器处理http协议。