原帖地址:http://blog.sina.com.cn/s/blog_62f987620100neph.html
【Android】HTTP協議的經典講解
(2010-12-23 17:08:22)轉載
標籤: android http macrocheng get post put head delete traceconnect options |
分類: Android |
一、什麼是HTTP協議 HTTP協議是一種應用程式層協議,HTTP是HyperText Transfer Protocol(超文字傳輸通訊協定 (HTTP))的英文縮寫。HTTP可以通過傳輸層的TCP協議在用戶端和伺服器之間傳輸資料。HTTP協議主要用於Web瀏覽器和Web伺服器之間的資料交換。我們在使用IE或Firefox瀏覽網頁或下載Web資源時,通過在地址欄中輸入http://host:port/path,開頭的4個字母http就相當於通知瀏覽器使用HTTP協議來和host所確定的伺服器進行通訊。HTTP協議誕生於上世紀90年代初;第一個被廣泛使用的版本是HTTP0.9。這個最初的版本非常簡陋,它只向伺服器發送一個非常簡單的請求,而伺服器也會返回一個很簡單的響應以及相應的HTML文本。在隨後的HTTP1.0中,增加了很多在HTTP0.9中沒有的特性,如增加了資源重定位,大量的狀態響應碼等。在最新的HTTP1.1中,對HTTP1.0做了更進一步的改進,除了增加了一些要求方法外,最大的改進就是可以使HTTP保持串連狀態。這對於一些頻繁傳輸資料的應用是非常有益的。由於HTTP協議已經達到了它的目標,因此,負責制定規範的W3C已經停止了對HTTP的改進(和HTTP相關的協議或擴充並未停止),所以,HTTP1.1將是HTTP協議的最後一個版本。無論你是從事網路程式開發,還是Web開發,或是網站的維護人員;都必須對HTTP協議有一個比較深入的瞭解。因此,HTTP協議不僅是Internet上應用最為廣泛的協議,也是應用協議家族中比較簡單的一種入門級協議;而且所有的Web伺服器無一例外地都支援HTTP協議。這也充分地說明,對於那些開發網路程式,尤其是開發各種類型的Web伺服器的開發人員,透徹地掌握HTTP協議將對你所開發的基於HTTP協議的系統產生直接的影響。由於本文的目的並不是講解HTTP協議,因此,只討論了HTTP協議的主要部分,如果讀者對HTTP協議感性趣,並想深入瞭解HTTP協議,請查看RFC2616或通過www.w3c.org來瞭解HTTP協議的詳情。二、HTTP的工作方式 HTTP協議採用了請求/響應的工作方式。基於HTTP1.0協議的用戶端在每次向伺服器發出請求後,伺服器就會向用戶端返迴響應訊息(包括請求是否正確以及所請求的資料),在確認用戶端已經收到響應訊息後,服務端就會關閉網路連接(其實是關閉TCP串連)。在這個資料轉送過程中,並不儲存任何曆史資訊和狀態資訊,因此,HTTP協議也被認為是無狀態的協議,圖1描繪了HTTP1.0協議的通訊過程。
圖1 HTTP1.0協議的通訊過程在HTTP1.0協議中,當Web瀏覽器發出請求時,就意味著一個請求/響應會話已經開始。在請求、響應結束後,伺服器就會立刻關閉這個串連。這種會話方式雖然簡便,但它會帶來另外一個問題。如果用戶端瀏覽器訪問的某個HTML或其他類型的Web頁中包含有其他的Web資源,如JavaScript檔案、影像檔、CSS檔案等;當瀏覽器每遇到這樣一個Web資源,就會建立一個HTTP會話。如果這樣的資源很多的話,就會加重伺服器的負擔,同時也會影響用戶端瀏覽器載入HTML等Web資源的效率。在對上述的缺陷進行改進和完善後,HTTP1.1協議進入了我們的視線。HTTP1.1和HTTP1.0相比較而言,最大的區別就是增加了持久串連支援。當用戶端使用HTTP1.1協議串連到伺服器後,伺服器就將關閉用戶端串連的主動權交還給用戶端;也就是說,在用戶端向伺服器發送一個請求並接收以一個響應後,只要不調用Socket類的close方法關閉網路連接,就可以繼續向伺服器發送HTTP請求。當HTML中含有其他的Web資源時,瀏覽器就可以使用同一個網路連接向下載這些資源,這樣就可以大大減輕伺服器的壓力。圖2示範了這一過程。圖2 HTTP1.1協議的通訊過程HTTP1.1除了支援持久串連外,還將HTTP1.0的要求方法從原來的三個(GET、POST和HEAD)擴充到了八個(OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE和CONNECT)。而且還增加了很多請求和響應欄位,如上述的持久串連的欄位Connection。這個欄位有兩個值,Close和Keep-Alive。如果使用Connection:Close,則關閉HTTP1.1的持久串連的功能,要開啟HTTP1.1的持久串連的功能,必須使用Connection:Keep-Alive,或者不加Connection欄位(因為HTTP1.1在預設情況下就是持久串連的)。除了這些,還提供了身份認證、狀態管理和緩衝(Cache)等相關的要求標頭和回應標頭。