轉載
原文地址:http://blog.itpub.net/15480802/viewspace-1340982/
connect方法
http 1.1定義了8種方法,connect為其中之一,HTTP/1.1協議中預留給能夠將連接改為管道方式的代理服務器。通常用於SSL加密服務器的鏈接(經由非加密的HTTP代理服務器)。
並非所有的http隧道支持connect方法,Http隧道分為兩種:
1 不使用CONNECT的隧道
不使用CONNECT的隧道,實現了數據包的重組和轉發。在Proxy收到來自客戶端的Http請求之后,會重新創建Request請求,並發送到目標服務器,。當目標服務器返回Response給Proxy之后,Proxy會對Response進行解析,然后重新組裝Response,發送給客戶端。所以,在不使用CONNECT方式建立的隧道,Proxy有機會對客戶端與目標服務器之間的通信數據進行窺探,而且有機會對數據進行串改。
2 使用CONNECT的隧道
而對於使用CONNECT的隧道則不同。當客戶端向Proxy發起Http CONNECT Method的時候,就是告訴Proxy,先在Proxy和目標服務器之間先建立起連接,在這個連接建立起來之后,目標服務器會返回一個回復給Proxy,Proxy將這個回復轉發給客戶端,這個Response是Proxy跟目標服務器連接建立的狀態回復,而不是請求數據的Response。在此之后,客戶端跟目標服務器的所有通信都將使用之前建立起來的建立。這種情況下的Http隧道,Proxy僅僅實現轉發,而不會關心轉發的數據。這也是為什么在使用Proxy的時候,Https請求必須首先使用Http CONNECT建立隧道。因為Https的數據都是經過加密的,Proxy是無法對Https的數據進行解密的,所以只能使用CONNECT,僅僅對通信數據進行轉發。
注意,proxy代理的是客戶端發起的TCP連接,以下是wiki的解釋
the client, using the "CONNECT" HTTP method, asks an HTTP Proxy server to forward the TCP connection to the desired destination. The server then proceeds to make the connection on behalf of the client. Once the connection has been established by the server, the Proxy server continues to proxy the TCP stream to and from the client. Note that only the initial connection request is HTTP - after that, the server simply proxies the established TCP connection.This mechanism is how a client behind an HTTP proxy can access websites using SSL (i.e. HTTPS).
http://en.wikipedia.org/wiki/HTTP_tunnel
與proxy相關字段
X-Forwarded-For(XFF)是用來識別通過HTTP代理或負載均衡方式連接到Web服務器的客戶端最原始的IP地址的HTTP請求頭字段; Squid 緩存代理服務器的開發人員最早引入了這一HTTP頭字段,如果沒有XFF或者另外一種相似的技術,所有通過代理服務器的連接只會顯示代理服務器的IP地址(而非連接發起的原始IP地址),這樣的代理服務器實際上充當了匿名服務提供者的角色,如果連接的原始IP地址不可得,惡意訪問的檢測與預防的難度將大大增加。
X-Forwarded-Host和X-Forwarded-Proto分別記錄客戶端最原始的主機和協議。
Proxy-Authorization:連接到proxy的身份驗證信息
Proxy-connection:它不是標准協議的一部分,標准協議中已經存在一種機制可以完成此協議頭的功能,這就是Connection頭域,與Proxy-Connection頭相比,Connection協議頭幾乎提供了相同的功能,除了錯誤部分。而且,Connection協議頭可用於任意連接之間,包括HTTP服務器,代理,客戶端,而不是像Proxy-Connection一樣,只能用於代理服務器和客戶端之間。
http 1.1其余7種方法
OPTIONS:這個方法可使服務器傳回該資源所支持的所有HTTP請求方法。用'*'來代替資源名稱,向Web服務器發送OPTIONS請求,可以測試服務器功能是否正常運作。
HEAD:與GET方法一樣,都是向服務器發出指定資源的請求。只不過服務器將不傳回資源的本文部份。它的好處在於,使用這個方法可以在不必傳輸全部內容的情況下,
就可以獲取其中“關於該資源的信息”(元信息或稱元數據)。
GET:向指定的資源發出“顯示”請求。使用GET方法應該只用在讀取數據,而不應當被用於產生“副作用”的操作中,例如在Web Application中,其中一個原因是GET可能會被
網絡蜘蛛等隨意訪問。
POST:向指定資源提交數據,請求服務器進行處理(例如提交表單或者上傳文件)。數據被包含在請求本文中。這個請求可能會創建新的資源或修改現有資源,或二者皆有。
PUT:向指定資源位置上傳其最新內容。
DELETE:請求服務器刪除Request-URI所標識的資源。
TRACE:回顯服務器收到的請求,主要用於測試或診斷。
http://zh.wikipedia.org/zh-cn/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE