HTTP代理協(xié)議
HTTP
代理分為兩種模式:HTTP
模式、隧道(TUNNEL
)模式娄帖。
HTTP模式
客戶端會將代理服務(wù)器當(dāng)成目標(biāo)服務(wù)器,發(fā)送HTTP
請求;代理服務(wù)器接收到客戶端直傳的HTTP
請求后挠说,解析HTTP
報文請求中的URL
,建立與目標(biāo)服務(wù)端的連接愿题,并將請求報文轉(zhuǎn)發(fā)至目標(biāo)服務(wù)器损俭,同時將目標(biāo)服務(wù)器返回的響應(yīng)報文返回給客戶端。
|-- 客戶端 ---| |------------------- 代理端 --------------------------| |------ 目標(biāo)服務(wù)器 -------|
------------- ----------- -------- ------------ ----------------------
| http請求報文 |------>| 解析請求頭 |--------| 建立連接 |------| 轉(zhuǎn)發(fā)請求報文 |------| 處理并產(chǎn)生HTTP相應(yīng)報文 |
------------- ----------- -------- ------------ ----------------------
|
| 產(chǎn)生
|
------------- ------------------------------------------------- ----------------------
| 接受到響應(yīng)報文 |<-------| 轉(zhuǎn)發(fā)響應(yīng)報文給客戶端 |------ | 響應(yīng)報文 |
------------- ------------------------------------------------- ----------------------
隧道(TUNNEL)模式
HTTP
模式很好的解決了大部分場景潘酗,但是解決不了HTTPS
密文傳輸問題杆兵,代理服務(wù)器沒有服務(wù)端密鑰,無法模擬目標(biāo)服務(wù)端對客戶端進(jìn)行HTTPS
握手仔夺,更不能代替目標(biāo)服務(wù)端響應(yīng)客戶端請求琐脏。
HTTP 1.1
協(xié)議的CONNECT
方法提供了一個解決思路,CONNECT
方法給予一個目標(biāo)地址,要求代理服務(wù)器建立一條到目標(biāo)地址的隧道日裙,之后的SSL
握手和接下來的數(shù)據(jù)交換將在隧道中進(jìn)行吹艇,傳輸?shù)牧髁客耆用埽矸?wù)器無法監(jiān)控阅签。
|--- 客戶端 ---| |------------------- 代理端 --------------------------| |------ 目標(biāo)服務(wù)器 -------|
------------- ----------- --------
| http請求報文 |----->| 解析請求頭 |--------| 建立連接 |
------------- ----------- --------
|
------------- |
| 200 Ok |<--------------------------------
-------------
------------- ----------------------------------------------------- ----------------------
| 請求字節(jié) |------>| 盲轉(zhuǎn)流量 |------>| 處理并返回?cái)?shù)據(jù) |
------------- ----------------------------------------------------- ----------------------
|
| 產(chǎn)生
|
------------- ----------------------------------------------------- ----------------------
| 響應(yīng)字節(jié) |<------| 盲轉(zhuǎn)響應(yīng) |<------| 響應(yīng)字節(jié) |
------------- ----------------------------------------------------- ----------------------
基于Netty的HTTP代理
根據(jù)以上協(xié)議內(nèi)容掐暮,編寫了一個基于Netty
的HTTP
代理服務(wù)。
項(xiàng)目地址:https://github.com/zk-123/http-proxy
release 下有現(xiàn)成的jar
可用政钟。
由于項(xiàng)目簡單路克,這里不在詳細(xì)講解,僅放置設(shè)計(jì)圖:
HTTP模式設(shè)計(jì)圖
隧道模式(TUNNEL)設(shè)計(jì)圖
最后
擁有代理能力就打開了一個不可思議的大門养交,這里講解僅僅是一個比較基礎(chǔ)的思路精算,后續(xù)可能會發(fā)現(xiàn)許多意向不到的神奇操作。