HTTP正向代理的兩種實現方式

http正向代理的兩種方式:一種是普通模式(RFC 7230 - HTTP/1.1:Message Syntax and Routing),一種是隧道模式(Tunneling TCP basedprotocols through Web proxy servers)

爲了便於解釋這些概念,先假設C是發起請求的客戶端,P是正向代理服務器,S是真正提供服務器的代理服務器。

普通模式實現:

這種模式下,C發起http請求,首先組織報文:例如

 

POST  http://your-server.com/test.html?key=val  HTTP/1.1
  #空行
Content-Type:application/x-www-form-urlencoded
Host:your-server.com
  #空行
key1=val&key2=val2&key3=val3

 

因爲C需要使用正向代理(一般是提前配置好代理服務器P的ip和port),

1)C首先和P服務器建立TCP連接,例如10.35.84.27:3122

2)通過和P的TCP連接發送原始http報文,如上所示

3)代理服務器P接受完整報文,處理,根據請求URL中的地址去和服務器S建立TCP連接。

注意:這裏代理服務器P不會根據請求頭Host中內容去建立連接,該字段被忽略,所以必須在URL中傳入目標服務器的地址信息(DNS或者ip:port)

4)代理服務器P將報文處理後發往目標服務器S,報文處理一般是在請求頭中加入X-Forward類信息。

5)目標服務器S將相應返回到代理服務器P,代理服務器將響應返回客戶端C。

隧道模式

客戶端組織報文,在發送報文前:

1)C和P先建立TCP連接

2)向P發送隧道請求行,請求建立隧道.

CONNECT your-server.com:port  HTTP/1.1
# 空行

3)代理服務器P接收到該請求行後,立即向請求行中標記的目標服務器S建立TCP連接。連接建立之後立即響應

HTTP/1.1 200 Connection Established

該響應只是一個說明P和S間的TCP連接已存在,隧道建立,接下里可以繼續發送數據包。

4) 客戶端收到該響應後,將之前組織的報文通過和P之間的TCP連接傳輸,P將數據包發往S,此時P只是進行透傳。這裏一般通過隧道發送的數據一般是經過SSL層加密了,

P收到的數據都是密文,無法解讀,只能進行透傳。P只是建立了一個TCP連接池,在TCP層做轉發

 

對比:

隧道模式下:代理服務器P不是在得到客戶端C的所有報文後才和目標服務器S建立TCP連接,而是在未獲得報文時就和目標服務器建立連接,而後將客戶端的報文進行轉發(這裏是一個一個package的轉發,即每收到HTTP報文的一個TCP package後立即發完目標服務器S,對於響應也是同樣,不會干涉HTTP協議層的處理,只進行TCP層轉發。

普通模式下:代理服務器P需要接收所有的報文後,並對報文進行處理後,和目標服務器S進行連接,然後接收目標服務器的所有響應報文,處理後發往客戶端C。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章