HTTP協議,對於web相關開發者來講極爲重要。本文將帶您分析HTTP協議的基本原理與機制html
HTTP協議用於客戶端與服務器之間的通訊,在通訊線路兩端,一定一端是客戶端,另外一端是服務器。
注意:客戶端與服務器的角色不是固定的,一端充當客戶端,也可能在某次請求中充當服務器。這取決與請求的發起端。HTTP協議屬於應用層,創建在傳輸層協議TCP之上。客戶端經過與服務器創建TCP鏈接,以後發送HTTP請求與接收HTTP響應都是經過訪問Socket接口來調用TCP協議實現。git
HTTP協議規定,由客戶端發起請求,服務器響應請求並返回信息。
如圖,反映了一次HTTP請求並接收一個HTML文件的過程與時間消耗(RTT)。客戶端經過TCP鏈接發送請求報文,服務器收到請求後向其傳輸文件並返回響應報文。github
請求報文web
GET /index.html HTTP/1.1 Host: www.cnblogs.com/ACFLOOD Content-Length: 16
請求報文是由請求方法,請求URI,協議版本,可選的首部字段以及內容實體構成。編程
本例中,GET表示請求方法,/index.jsp是請求URI,HTTP/1.1是協議版本,其他的是首部字段。segmentfault
響應報文安全
HTTP/1.1 200 OK Date: Mon, 10 May 2016 07:50:15 GMT Content-Length: 300 Content-Type: text/html
響應報文基本上由協議版本,狀態碼(返回請求成功或失敗狀況),對狀態碼的解釋短語,可選的首部字段以及內容實體構成。服務器
本例中,HTTP/1.1表示協議版本,200表示狀態碼,OK是對狀態碼的描述,Date是響應日期,與Content-Length和Content-Type同樣,都屬於首部字段。網絡
HTTP是一種無狀態(stateless) 協議,HTTP協議自己不會對發送過的請求和相應的通訊狀態進行持久化處理。這樣作的目的是爲了保持HTTP協議的簡單性,從而可以快速處理大量的事務,提升效率。session
然而,在許多應用場景中,咱們須要保持用戶登陸的狀態或記錄用戶購物車中的商品。因爲HTTP是無狀態協議,因此必須引入一些技術來記錄管理狀態,例如Cookie。
下圖展現了基本的HTTP方法。
GET:獲取資源。經過URI請求訪問已被識別的資源,通過服務器解析後返回相應內容。
POST:傳輸實體。例如登陸註冊時表單的提交。
PUT:傳輸文件。相似於FTP協議中的文件上傳,PUT方法要求在請求報文的主體包含文件,保存到指定URI的位置。因爲PUT方法沒有驗證機制,存在安全性問題,因此必須配合採用安全標準(如REST)。
HEAD:得到報文首部。不返回報文主體,僅返回首部。
DELETE:刪除文件。DELELTE方法請求刪除服務器上的資源,一樣存在安全性問題。因此必須有驗證機制與之配合。
OPTIONS:詢問服務器支持哪些方法。示例:
請求報文
OPTIONS * HTTP/1.1 Host: www.cnblogs.com
響應報文
HTTP/1.1 200 OK Allow: GET, POST, HEAD, OPTIONS
本例中,客戶端經過OPTIONS *詢問服務器支持的方法。響應報文最後返回了支持的 方法類型。
TRACE:追蹤路徑。發送請求時,經過在Max-Forwards首部字段中填入數值,每通過一個服務器數值減一,當減爲零以後中止傳輸,最後收到請求的服務器發出響應。
CONNECT:經過與代理服務器創建隧道,使用隧道協議加密以後,與服務器進行TCP通訊。經常使用的隧道協議有SSL(Secure Socket Layer)以及TLS(Transport Layer Security)。
在實際的應用中,客戶端每每會發出一系列請求,接着服務器端對每一個請求進行響應。對於這些請求|響應,若是每次都通過一個單獨的TCP鏈接發送,稱爲非持久鏈接。反之,若是每次都通過相同的TCP鏈接進行發送,稱爲持久鏈接。
非持久鏈接在每次請求|響應以後都要斷開鏈接,下次再創建新的TCP鏈接,這樣就形成了大量的通訊開銷。例如前面提到的往返時間(RTT) 就是在創建TCP鏈接的過程當中的代價。
非持久鏈接給服務器帶來了沉重的負擔,每臺服務器可能同時面對數以百計甚至更多的請求。持久鏈接就是爲了解決這些問題,其特色是一直保持TCP鏈接狀態,直到遇到明確的中斷要求以後再中斷鏈接。持久鏈接減小了通訊開銷,節省了通訊量。
圖 持久化鏈接節省通訊開銷
本文分析了基本的HTTP運行機制與原理,經過一些實例分析了HTTP請求與響應的過程,以及常見的HTTP方法。對於HTTP鏈接的特性與機制也進行了探討。固然這些只是簡單的創建起基礎的概念。後續的系列我還會對Cookie與session的原理,請求發起的過程以及Socket(套接字)的研究,HTTP解析的過程進行深刻思考和剖析。
做者: Project_Li
專欄:編程夢工廠
參考資料:《圖解HTTP協議》 《計算機網絡:自頂向下方法》 etc
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
若是您以爲本文對您有所幫助,就給俺點個贊吧!