本系列第一節,我們回顧了與HTTP協議有關的基本術語和概念,本文將分析HTTP協議的基本原理與機制
-
HTTP協議的用途
HTTP協議用於客戶端與服務器之間的通信,在通信線路兩端,必定一端是客戶端,另一端是服務器。
注意:客戶端與服務器的角色不是固定的,一端充當客戶端,也可能在某次請求中充當服務器。這取決與請求的發起端。HTTP協議屬於應用層,建立在傳輸層協議TCP之上。客戶端通過與服務器建立TCP連接,之后發送HTTP請求與接收HTTP響應都是通過訪問Socket接口來調用TCP協議實現。 -
請求與響應
HTTP協議規定,由客戶端發起請求,服務器響應請求並返回信息。
如圖,反映了一次HTTP請求並接收一個HTML文件的過程與時間消耗(RTT)。客戶端通過TCP連接發送請求報文,服務器收到請求后向其傳輸文件並返回響應報文。-
請求報文
GET /index.html HTTP/1.1 Host: www.cnblogs.com/ACFLOOD Content-Length: 16
請求報文是由請求方法,請求URI,協議版本,可選的首部字段以及內容實體構成。
本例中,GET表示請求方法,/index.jsp是請求URI,HTTP/1.1是協議版本,其余的是首部字段。
-
響應報文
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是無狀態協議
HTTP是一種無狀態(stateless) 協議,HTTP協議本身不會對發送過的請求和相應的通信狀態進行持久化處理。這樣做的目的是為了保持HTTP協議的簡單性,從而能夠快速處理大量的事務,提高效率。
然而,在許多應用場景中,我們需要保持用戶登錄的狀態或記錄用戶購物車中的商品。由於HTTP是無狀態協議,所以必須引入一些技術來記錄管理狀態,例如Cookie。
-
HTTP方法
在第一節,我們曾辨析過GET與POST方法。實際上常用的HTTP方法遠不止這些,下圖展示了基本的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解析的過程進行深入思考和剖析。
作者: I'm coding
鏈接:ACFLOOD
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
如果您覺得本文對您有所幫助,就給俺點個贊吧!