HTTP 訊息

HTTP 訊息是伺服器和客戶端之間交換資料的途徑。訊息分為兩種:請求,由客戶端傳送,用於觸發伺服器上的操作;以及響應,即來自伺服器的答案。

Web 開發人員,或網站管理員,很少自己編寫這些文字形式的 HTTP 訊息:軟體、Web 瀏覽器、代理或 Web 伺服器會執行此操作。它們透過配置檔案(針對代理或伺服器)、API(針對瀏覽器)或其他介面提供 HTTP 訊息。

From a user-, script-, or server- generated event, an HTTP/1.x msg is generated, and if HTTP/2 is in use, it is binary framed into an HTTP/2 stream, then sent.

HTTP 請求和響應具有相似的結構,由以下部分組成:

  1. 起始行,描述要執行的請求,或描述其成功或失敗的狀態。這始終是單行。
  2. 一組可選的HTTP 標頭,用於指定請求,或描述訊息中包含的正文。
  3. 一個空行,表示請求的所有元資訊已傳送。
  4. 一個可選的正文,包含與請求相關聯的資料(如 HTML 表單的內容),或與響應相關聯的文件。正文的存在及其大小由起始行和 HTTP 標頭指定。

HTTP 訊息的起始行和 HTTP 標頭統稱為請求的頭部,之後包含其內容的部分稱為正文

Requests and responses share a common structure in HTTP

HTTP 請求

請求行

注意:在請求中,起始行稱為“請求行”。

HTTP 請求是由客戶端傳送的訊息,用於在伺服器上發起操作。它們的請求行包含三個元素:

  1. HTTP 方法,動詞(如 GETPUTPOST)或名詞(如 HEADOPTIONS),描述要執行的操作。例如,GET 表示應獲取資源,而 POST 表示將資料推送到伺服器(建立或修改資源,或生成要發回的臨時文件)。
  2. 請求目標,通常是 URL,或協議、埠和域的絕對路徑,通常由請求上下文確定。此請求目標的格式因不同的 HTTP 方法而異。它可以是:
    • 絕對路徑,最後以 '?' 和查詢字串結尾。這是最常見的形式,稱為原點形式,並用於 GETPOSTHEADOPTIONS 方法。
      • POST / HTTP/1.1
      • GET /background.png HTTP/1.0
      • HEAD /test.html?query=alibaba HTTP/1.1
      • OPTIONS /anypage.html HTTP/1.0
    • 完整 URL,稱為絕對形式,主要用於連線到代理時使用 GETGET https://mdn.club.tw/en-US/docs/Web/HTTP/Messages HTTP/1.1
    • URL 的授權元件,包括域名和可選的埠(以 ':' 為字首),稱為授權形式。它僅在設定 HTTP 隧道時與 CONNECT 一起使用。CONNECT developer.mozilla.org:80 HTTP/1.1
    • 星號形式,一個簡單的星號 ('*'),用於 OPTIONS,表示整個伺服器。OPTIONS * HTTP/1.1
  3. HTTP 版本,它定義了剩餘訊息的結構,充當響應中預期使用的版本的指示器。

標頭

HTTP 標頭 來自請求,遵循與 HTTP 標頭相同的基本結構:一個不區分大小寫的字串,後跟一個冒號 (':') 和一個結構取決於標頭型別的值。整個標頭,包括其值,都是一行,可以很長。

請求中可以出現許多不同的標頭。它們可以分為幾個組:

Example of headers in an HTTP request

正文

響應的最後一部分是正文。並非所有響應都包含正文:如果響應的狀態碼足以回答請求,而無需包含訊息 內容(如 201 Created204 No Content),則通常不包含正文。

正文可以大體上分為兩類:

HTTP 響應

狀態行

注意:在響應中,起始行稱為“狀態行”。

HTTP 響應的起始行,稱為狀態行,包含以下資訊:

  1. 協議版本,通常是 HTTP/1.1,但也可以是 HTTP/1.0
  2. 狀態碼,指示請求成功或失敗。常見的狀態碼有 200404302
  3. 狀態文字。簡短的純資訊文字描述,用於幫助人類理解 HTTP 訊息。

典型的狀態行如下所示:HTTP/1.1 404 Not Found

標頭

HTTP 標頭 對於響應,遵循與任何其他標頭相同的結構:一個不區分大小寫的字串,後跟一個冒號 (':') 和一個結構取決於標頭型別的值。整個標頭,包括其值,都顯示為一行。

響應中可以出現許多不同的標頭。它們可以分為幾個組:

Example of headers in an HTTP response

正文

響應的最後一部分是正文。並非所有響應都包含正文:如果響應的狀態碼足以回答請求,而無需包含內容(如 201 Created204 No Content),則通常不包含正文。

正文可以大體上分為三類:

  • 單資源正文,由一個已知長度的單個檔案組成,由兩個標頭定義:Content-TypeContent-Length
  • 單資源正文,由一個未知長度的單個檔案組成,透過塊編碼,Transfer-Encoding 設定為 chunked
  • 多資源正文,由多部分正文組成,每個部分包含不同的資訊部分。這些相對罕見。

HTTP/2 幀

HTTP/1.x 訊息在效能方面存在一些弊端:

  • 標頭與正文不同,未壓縮。
  • 標頭在從一條訊息到下一條訊息的過程中通常非常相似,但仍然在連線之間重複。
  • 儘管 HTTP/1.1 有 管道,但它在大多數瀏覽器中預設情況下未啟用,並且不允許進行多路複用(即併發傳送請求)。需要在同一個伺服器上開啟多個連線才能併發傳送請求;而熱 TCP 連線比冷連線效率更高。

HTTP/2 引入了額外的步驟:它將 HTTP/1.x 訊息劃分為嵌入在流中的幀。資料幀和標頭幀是分開的,這允許標頭壓縮。可以將多個流組合在一起,這個過程稱為多路複用,從而更有效地利用底層 TCP 連線。

HTTP/2 modifies the HTTP message to divide them in frames (part of a single stream), allowing for more optimization.

HTTP 幀現在對 Web 開發人員透明。這是 HTTP/2 中在 HTTP/1.1 訊息和底層傳輸協議之間新增的額外步驟。Web 開發人員使用的 API 無需進行任何更改即可利用 HTTP 幀;當瀏覽器和伺服器都支援時,HTTP/2 將自動啟用並使用。

結論

HTTP 訊息是使用 HTTP 的關鍵;它們的結構很簡單,並且具有很高的可擴充套件性。HTTP/2 幀機制在不從根本上修改 HTTP/1.x 語法的情況下,在 HTTP/1.x 語法和底層傳輸協議之間添加了一個新的中間層:在經過驗證的機制之上構建。