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。