典型的 HTTP 會話

在像 HTTP 這樣的客戶端-伺服器協議中,會話包含三個階段

  1. 客戶端建立 TCP 連線(如果傳輸層不是 TCP,則建立相應的連線)。
  2. 客戶端傳送其請求,並等待答案。
  3. 伺服器處理請求,傳送回其答案,提供狀態碼和適當的資料。

從 HTTP/1.1 開始,連線在完成第三階段後不再關閉,並且客戶端現在被授予進一步的請求:這意味著第二和第三階段現在可以執行任意次數。

建立連線

在客戶端-伺服器協議中,是客戶端建立連線。在 HTTP 中開啟連線意味著在底層傳輸層(通常是 TCP)中啟動連線。

對於計算機上的 HTTP 伺服器,TCP 預設埠是 80 埠。也可以使用其他埠,例如 8000 或 8080。要獲取的頁面的 URL 包含域名和埠號,但如果埠號為 80,則可以省略埠號。有關更多詳細資訊,請參閱 URL 參考

注意:客戶端-伺服器模型不允許伺服器在沒有顯式請求的情況下向客戶端傳送資料。但是,各種 Web API 啟用了這種用例,包括 推送 API伺服器傳送事件WebSocket API

傳送客戶端請求

連線建立後,使用者代理可以傳送請求(使用者代理通常是 Web 瀏覽器,但也可能是其他任何東西,例如爬蟲)。客戶端請求由文字指令組成,這些指令由 CRLF(回車符,後跟換行符)分隔,分為三個塊

  1. 第一行包含請求方法及其引數
    • 文件的路徑,作為不帶協議或域名名的絕對 URL
    • HTTP 協議版本
  2. 後續行表示 HTTP 標頭,它向伺服器提供有關哪種資料型別合適的資訊(例如,語言、MIME 型別)或其他更改其行為的資料(例如,如果已快取,則不傳送答案)。這些 HTTP 標頭形成一個塊,該塊以空行結束。
  3. 最後一個塊是可選資料塊,它可能包含主要由 POST 方法使用的其他資料。

示例請求

獲取 developer.mozilla.org 的根頁面(https://mdn.club.tw/),並告訴伺服器使用者代理如果可能,希望以法語獲取頁面

http
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr

觀察最後的空行,它將資料塊與標頭塊隔開。由於 HTTP 標頭中沒有提供 Content-Length,因此此資料塊顯示為空,標記標頭的結束,允許伺服器在收到此空行時立即處理請求。

例如,傳送表單的結果

http
POST /contact_form.php HTTP/1.1
Host: developer.mozilla.org
Content-Length: 64
Content-Type: application/x-www-form-urlencoded

name=Joe%20User&request=Send%20me%20one%20of%20your%20catalogue

請求方法

HTTP 定義了一組 請求方法,指示要對資源執行的所需操作。雖然它們也可以是名詞,但這些請求方法有時被稱為 HTTP 動詞。最常見的請求是 GETPOST

  • GET 方法請求指定資源的資料表示。使用 GET 的請求應該只檢索資料。
  • POST 方法將資料傳送到伺服器,以便它可以更改其狀態。這通常是用於 HTML 表單 的方法。

伺服器響應結構

連線的代理傳送其請求後,Web 伺服器會處理它,並最終返回響應。類似於客戶端請求,伺服器響應由文字指令組成,這些指令由 CRLF 分隔,但分為三個塊

  1. 第一行(狀態行)包含對使用的 HTTP 版本的確認,後跟響應狀態碼(及其在人類可讀文字中的簡要含義)。
  2. 後續行表示特定的 HTTP 標頭,它向客戶端提供有關傳送資料的 資訊(例如,型別、資料大小、使用的壓縮演算法、有關快取的提示)。與客戶端請求的 HTTP 標頭塊類似,這些 HTTP 標頭形成一個以空行結束的塊。
  3. 最後一個塊是資料塊,它包含可選資料。

示例響應

成功的網頁響應

http
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 55743
Connection: keep-alive
Cache-Control: s-maxage=300, public, max-age=0
Content-Language: en-US
Date: Thu, 06 Dec 2018 17:37:18 GMT
ETag: "2e77ad1dc6ab0b53a2996dfd4653c1c3"
Server: meinheld/0.6.1
Strict-Transport-Security: max-age=63072000
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Vary: Accept-Encoding,Cookie
Age: 7

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>A simple webpage</title>
</head>
<body>
  <h1>Simple HTML webpage</h1>
  <p>Hello, world!</p>
</body>
</html>

通知請求的資源已永久移動

http
HTTP/1.1 301 Moved Permanently
Server: Apache/2.4.37 (Red Hat)
Content-Type: text/html; charset=utf-8
Date: Thu, 06 Dec 2018 17:33:08 GMT
Location: https://mdn.club.tw/ (this is the new link to the resource; it is expected that the user-agent will fetch it)
Keep-Alive: timeout=15, max=98
Accept-Ranges: bytes
Via: Moz-Cache-zlb05
Connection: Keep-Alive
Content-Length: 325 (the content contains a default page to display if the user-agent is not able to follow the link)

<!DOCTYPE html>… (contains a site-customized page helping the user to find the missing resource)

通知請求的資源不存在

http
HTTP/1.1 404 Not Found
Content-Type: text/html; charset=utf-8
Content-Length: 38217
Connection: keep-alive
Cache-Control: no-cache, no-store, must-revalidate, max-age=0
Content-Language: en-US
Date: Thu, 06 Dec 2018 17:35:13 GMT
Expires: Thu, 06 Dec 2018 17:35:13 GMT
Server: meinheld/0.6.1
Strict-Transport-Security: max-age=63072000
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Vary: Accept-Encoding,Cookie
X-Cache: Error from cloudfront

<!DOCTYPE html>… (contains a site-customized page helping the user to find the missing resource)

響應狀態碼

HTTP 響應狀態碼 指示特定的 HTTP 請求是否已成功完成。響應被分為五類:資訊響應、成功響應、重定向、客戶端錯誤和伺服器錯誤。

  • 200:OK。請求已成功。
  • 301:已永久移動。此響應程式碼表示請求資源的 URI 已更改。
  • 404:未找到。伺服器無法找到請求的資源。

另請參閱