走進HTTP協議之二 基本HTTP機制


本系列第一節,我們回顧了與HTTP協議有關的基本術語和概念,本文將分析HTTP協議的基本原理與機制

  1. HTTP協議的用途
    image
    HTTP協議用於客戶端與服務器之間的通信,在通信線路兩端,必定一端是客戶端,另一端是服務器。
    注意:客戶端與服務器的角色不是固定的,一端充當客戶端,也可能在某次請求中充當服務器。這取決與請求的發起端。HTTP協議屬於應用層,建立在傳輸層協議TCP之上。客戶端通過與服務器建立TCP連接,之后發送HTTP請求接收HTTP響應都是通過訪問Socket接口來調用TCP協議實現。

  2. 請求與響應
    HTTP協議規定,由客戶端發起請求,服務器響應請求並返回信息。image
    如圖,反映了一次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一樣,都屬於首部字段

  3. HTTP是無狀態協議

    HTTP是一種無狀態(stateless) 協議,HTTP協議本身不會對發送過的請求和相應的通信狀態進行持久化處理。這樣做的目的是為了保持HTTP協議的簡單性,從而能夠快速處理大量的事務,提高效率。

    然而,在許多應用場景中,我們需要保持用戶登錄的狀態或記錄用戶購物車中的商品。由於HTTP是無狀態協議,所以必須引入一些技術來記錄管理狀態,例如Cookie

  4. HTTP方法

    在第一節,我們曾辨析過GET與POST方法。實際上常用的HTTP方法遠不止這些,下圖展示了基本的HTTP方法。
    image

    • 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)

  5. 非持久連接 和 持久連接

    在實際的應用中,客戶端往往會發出一系列請求,接着服務器端對每個請求進行響應。對於這些請求|響應,如果每次都經過一個單獨的TCP連接發送,稱為非持久連接。反之,如果每次都經過相同的TCP連接進行發送,稱為持久連接

    非持久連接在每次請求|響應之后都要斷開連接,下次再建立新的TCP連接,這樣就造成了大量的通信開銷。例如前面提到的往返時間(RTT) 就是在建立TCP連接的過程中的代價。

    非持久連接給服務器帶來了沉重的負擔,每台服務器可能同時面對數以百計甚至更多的請求。持久連接就是為了解決這些問題,其特點是一直保持TCP連接狀態,直到遇到明確的中斷要求之后再中斷連接。持久連接減少了通信開銷,節省了通信量。
    image圖 持久化連接節省通信開銷

  6. 總結

    本文分析了基本的HTTP運行機制與原理,通過一些實例分析了HTTP請求與響應的過程,以及常見的HTTP方法。對於HTTP連接的特性與機制也進行了探討。當然這些只是簡單的建立起基礎的概念。后續的系列我還會對Cookie與session的原理,請求發起的過程以及Socket(套接字)的理,HTTP解析的過程進行深入思考和剖析。


作者: I'm coding

鏈接ACFLOOD

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

如果您覺得本文對您有所幫助,就給俺點個贊吧!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM