基于Netty的HTTP代理

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代理

根据以上协议内容,编写了一个基于NettyHTTP代理服务。

项目地址:https://github.com/zk-123/http-proxy

release 下有现成的jar可用。

由于项目简单,这里不在详细讲解,仅放置设计图:

HTTP模式设计图

HTTP模式设计图

隧道模式(TUNNEL)设计图

隧道模式(TUNNEL)设计图

最后

拥有代理能力就打开了一个不可思议的大门,这里讲解仅仅是一个比较基础的思路,后续可能会发现许多意向不到的神奇操作。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Web 页面的实现 Web 基于 HTTP 协议通信 客户端(Client)的 Web 浏览器从 Web 服务器端...
    毛圈阅读 1,139评论 0 2
  • 作者:涤生_Woo链接:https://www.jianshu.com/p/6e9e4156ece3 本篇文章篇幅...
    Fi的学习笔记阅读 1,742评论 0 4
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,242评论 6 13
  • 最近每天入睡前都喜欢听听安静的音乐。听他们静静地唱着浮世安好,感觉生活真的很柔软。会好好的生活。
    Super年阅读 163评论 0 0
  • 全实木家具全实木家具优点差不多应该有以下几点 1、天然、环保、健康,并且实木家具透露着自然的原始之美。 2、实木家...
    婷婷1224阅读 341评论 0 0