一個典型的 HTTP 會話
在客戶端-伺服器協議(如 HTTP)中,會話包含三個階段:
- 客戶端建立 TCP 連線(如果傳輸層不是 TCP,則建立相應的連線)。
- 客戶端傳送請求,並等待響應。
- 伺服器處理請求,傳送迴響應,提供狀態碼和相應資料。
從 HTTP/1.1 開始,連線在完成第三階段後不再關閉,客戶端現在可以發出進一步的請求:這意味著第二和第三階段現在可以執行任意次。
建立連線
在客戶端-伺服器協議中,由客戶端建立連線。在 HTTP 中開啟連線意味著在底層傳輸層(通常是 TCP)中啟動連線。
對於 TCP,計算機上 HTTP 伺服器的預設埠是埠 80。也可以使用其他埠,例如 8000 或 8080。要獲取的頁面的 URL 包含域名和埠號,但如果埠號是 80,則可以省略。有關更多詳細資訊,請參閱URL 參考。
注意:客戶端-伺服器模型不允許伺服器在沒有明確請求的情況下向客戶端傳送資料。但是,各種 Web API 實現了此用例,包括 Push API、Server-sent events 和 WebSockets API。
傳送客戶端請求
一旦建立連線,使用者代理就可以傳送請求(使用者代理通常是 Web 瀏覽器,但也可以是其他任何東西,例如爬蟲)。客戶端請求由文字指令組成,這些指令由 CRLF(回車符,後跟換行符)分隔,分為三個塊:
-
第一行包含請求方法及其引數
- 文件的路徑,作為不帶協議或域名的絕對 URL
- HTTP 協議版本
-
後續行表示 HTTP 頭,向伺服器提供有關適當資料型別(例如,語言、MIME 型別)的資訊,或更改其行為的其他資料(例如,如果已快取則不傳送響應)。這些 HTTP 頭形成一個塊,以空行結束。
-
最後一個塊是可選的資料塊,其中可能包含主要由 POST 方法使用的更多資料。
請求示例
獲取 developer.mozilla.org 的根頁面 (https://mdn.club.tw/),並告知伺服器如果可能,使用者代理更喜歡法文頁面
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr
請注意最後一行空行,它將資料塊與頭塊分隔開。由於 HTTP 頭中沒有提供 Content-Length,因此此資料塊為空,標記了頭的結束,允許伺服器在收到此空行時立即處理請求。
例如,傳送表單結果
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 動詞。最常見的請求是 GET 和 POST。
伺服器響應結構
連線代理傳送請求後,Web 伺服器會處理它,並最終返回響應。與客戶端請求類似,伺服器響應由文字指令組成,由 CRLF 分隔,但分為三個塊:
- 第一行,即狀態行,包含所用 HTTP 版本的確認,後跟響應狀態碼(及其易於理解的簡短含義)。
- 後續行表示特定的 HTTP 頭,向客戶端提供有關傳送資料的資訊(例如,型別、資料大小、使用的壓縮演算法、快取提示)。與客戶端請求的 HTTP 頭塊類似,這些 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 basic webpage</title>
</head>
<body>
<h1>Basic HTML webpage</h1>
<p>Hello, world!</p>
</body>
</html>
通知請求的資源已永久移動
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/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 請求是否已成功完成。響應分為五類:資訊響應、成功響應、重定向、客戶端錯誤和伺服器錯誤。