HTTP代理协议
HTTP
代理分为两种模式:HTTP
模式、隧道(TUNNEL
)模式。
HTTP模式
客户端会将代理服务器当成目标服务器,发送HTTP
请求;代理服务器接收到客户端直传的HTTP
请求后,解析HTTP
报文请求中的URL
,建立与目标服务端的连接,并将请求报文转发至目标服务器,同时将目标服务器返回的响应报文返回给客户端。
|-- 客户端 ---| |------------------- 代理端 --------------------------| |------ 目标服务器 -------|
------------- ----------- -------- ------------ ----------------------
| http请求报文 |------>| 解析请求头 |--------| 建立连接 |------| 转发请求报文 |------| 处理并产生HTTP相应报文 |
------------- ----------- -------- ------------ ----------------------
|
| 产生
|
------------- ------------------------------------------------- ----------------------
| 接受到响应报文 |<-------| 转发响应报文给客户端 |------ | 响应报文 |
------------- ------------------------------------------------- ----------------------
隧道(TUNNEL)模式
HTTP
模式很好的解决了大部分场景,但是解决不了HTTPS
密文传输问题,代理服务器没有服务端密钥,无法模拟目标服务端对客户端进行HTTPS
握手,更不能代替目标服务端响应客户端请求。
HTTP 1.1
协议的CONNECT
方法提供了一个解决思路,CONNECT
方法给予一个目标地址,要求代理服务器建立一条到目标地址的隧道,之后的SSL
握手和接下来的数据交换将在隧道中进行,传输的流量完全加密,代理服务器无法监控。
|--- 客户端 ---| |------------------- 代理端 --------------------------| |------ 目标服务器 -------|
------------- ----------- --------
| http请求报文 |----->| 解析请求头 |--------| 建立连接 |
------------- ----------- --------
|
------------- |
| 200 Ok |<--------------------------------
-------------
------------- ----------------------------------------------------- ----------------------
| 请求字节 |------>| 盲转流量 |------>| 处理并返回数据 |
------------- ----------------------------------------------------- ----------------------
|
| 产生
|
------------- ----------------------------------------------------- ----------------------
| 响应字节 |<------| 盲转响应 |<------| 响应字节 |
------------- ----------------------------------------------------- ----------------------
基于Netty的HTTP代理
根据以上协议内容,编写了一个基于Netty
的HTTP
代理服务。
项目地址:https://github.com/zk-123/http-proxy
release 下有现成的jar
可用。
由于项目简单,这里不在详细讲解,仅放置设计图:
HTTP模式设计图
隧道模式(TUNNEL)设计图
隧道模式(TUNNEL)设计图最后
拥有代理能力就打开了一个不可思议的大门,这里讲解仅仅是一个比较基础的思路,后续可能会发现许多意向不到的神奇操作。
网友评论