HTTP 訊息
HTTP 訊息是伺服器和客戶端之間交換資料的途徑。訊息分為兩種:請求,由客戶端傳送,用於觸發伺服器上的操作;以及響應,即來自伺服器的答案。
Web 開發人員,或網站管理員,很少自己編寫這些文字形式的 HTTP 訊息:軟體、Web 瀏覽器、代理或 Web 伺服器會執行此操作。它們透過配置檔案(針對代理或伺服器)、API(針對瀏覽器)或其他介面提供 HTTP 訊息。
HTTP 請求和響應具有相似的結構,由以下部分組成:
- 起始行,描述要執行的請求,或描述其成功或失敗的狀態。這始終是單行。
- 一組可選的HTTP 標頭,用於指定請求,或描述訊息中包含的正文。
- 一個空行,表示請求的所有元資訊已傳送。
- 一個可選的正文,包含與請求相關聯的資料(如 HTML 表單的內容),或與響應相關聯的文件。正文的存在及其大小由起始行和 HTTP 標頭指定。
HTTP 訊息的起始行和 HTTP 標頭統稱為請求的頭部,之後包含其內容的部分稱為正文。
HTTP 請求
請求行
注意:在請求中,起始行稱為“請求行”。
HTTP 請求是由客戶端傳送的訊息,用於在伺服器上發起操作。它們的請求行包含三個元素:
- HTTP 方法,動詞(如
GET、PUT或POST)或名詞(如HEAD或OPTIONS),描述要執行的操作。例如,GET表示應獲取資源,而POST表示將資料推送到伺服器(建立或修改資源,或生成要發回的臨時文件)。 - 請求目標,通常是 URL,或協議、埠和域的絕對路徑,通常由請求上下文確定。此請求目標的格式因不同的 HTTP 方法而異。它可以是:
- 絕對路徑,最後以
'?'和查詢字串結尾。這是最常見的形式,稱為原點形式,並用於GET、POST、HEAD和OPTIONS方法。POST / HTTP/1.1GET /background.png HTTP/1.0HEAD /test.html?query=alibaba HTTP/1.1OPTIONS /anypage.html HTTP/1.0
- 完整 URL,稱為絕對形式,主要用於連線到代理時使用
GET。GET 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
- 絕對路徑,最後以
- HTTP 版本,它定義了剩餘訊息的結構,充當響應中預期使用的版本的指示器。
標頭
HTTP 標頭 來自請求,遵循與 HTTP 標頭相同的基本結構:一個不區分大小寫的字串,後跟一個冒號 (':') 和一個結構取決於標頭型別的值。整個標頭,包括其值,都是一行,可以很長。
請求中可以出現許多不同的標頭。它們可以分為幾個組:
- 通用標頭,如
Via,適用於整個訊息。 - 請求標頭,如
User-Agent或Accept,透過進一步指定(如Accept-Language)、提供上下文(如Referer)或有條件地限制(如If-None-Match)來修改請求。 - 表示標頭,如
Content-Type,用於描述訊息資料的原始格式以及應用的任何編碼(僅在訊息包含正文時存在)。
正文
響應的最後一部分是正文。並非所有響應都包含正文:如果響應的狀態碼足以回答請求,而無需包含訊息 內容(如 201 Created 或 204 No Content),則通常不包含正文。
正文可以大體上分為兩類:
- 單資源正文,由單個檔案組成,由兩個標頭定義:
Content-Type和Content-Length。 - 多資源正文,由多部分正文組成,每個部分包含不同的資訊。這通常與 HTML 表單 相關聯。
HTTP 響應
狀態行
標頭
HTTP 標頭 對於響應,遵循與任何其他標頭相同的結構:一個不區分大小寫的字串,後跟一個冒號 (':') 和一個結構取決於標頭型別的值。整個標頭,包括其值,都顯示為一行。
響應中可以出現許多不同的標頭。它們可以分為幾個組:
- 通用標頭,如
Via,適用於整個訊息。 - 響應標頭,如
Vary和Accept-Ranges,提供有關伺服器的附加資訊,這些資訊不適合放在狀態行中。 - 表示標頭,如
Content-Type,用於描述訊息資料的原始格式以及應用的任何編碼(僅在訊息包含正文時存在)。
正文
響應的最後一部分是正文。並非所有響應都包含正文:如果響應的狀態碼足以回答請求,而無需包含內容(如 201 Created 或 204 No Content),則通常不包含正文。
正文可以大體上分為三類:
- 單資源正文,由一個已知長度的單個檔案組成,由兩個標頭定義:
Content-Type和Content-Length。 - 單資源正文,由一個未知長度的單個檔案組成,透過塊編碼,
Transfer-Encoding設定為chunked。 - 多資源正文,由多部分正文組成,每個部分包含不同的資訊部分。這些相對罕見。
HTTP/2 幀
HTTP/1.x 訊息在效能方面存在一些弊端:
- 標頭與正文不同,未壓縮。
- 標頭在從一條訊息到下一條訊息的過程中通常非常相似,但仍然在連線之間重複。
- 儘管 HTTP/1.1 有 管道,但它在大多數瀏覽器中預設情況下未啟用,並且不允許進行多路複用(即併發傳送請求)。需要在同一個伺服器上開啟多個連線才能併發傳送請求;而熱 TCP 連線比冷連線效率更高。
HTTP/2 引入了額外的步驟:它將 HTTP/1.x 訊息劃分為嵌入在流中的幀。資料幀和標頭幀是分開的,這允許標頭壓縮。可以將多個流組合在一起,這個過程稱為多路複用,從而更有效地利用底層 TCP 連線。
HTTP 幀現在對 Web 開發人員透明。這是 HTTP/2 中在 HTTP/1.1 訊息和底層傳輸協議之間新增的額外步驟。Web 開發人員使用的 API 無需進行任何更改即可利用 HTTP 幀;當瀏覽器和伺服器都支援時,HTTP/2 將自動啟用並使用。
結論
HTTP 訊息是使用 HTTP 的關鍵;它們的結構很簡單,並且具有很高的可擴充套件性。HTTP/2 幀機制在不從根本上修改 HTTP/1.x 語法的情況下,在 HTTP/1.x 語法和底層傳輸協議之間添加了一個新的中間層:在經過驗證的機制之上構建。