HTTP/HTTPS:報文格式、方法、狀態碼、緩存、SSL/TLS握手
1. HTTP報文格式
1.1 HTTP請求報文(Request)
GET /api/v1/users HTTP/1.1 // 請求行:方法、URI、協議版本
Host: api.example.com // 請求頭 (Headers)
User-Agent: Mozilla/5.0...
Accept: application/json
Content-Type: application/json
Authorization: Bearer xxxx...// 空行 (CRLF),分隔頭部和體
{"name": "John"} // 請求體 (Body),GET請求通常沒有Body
- 請求行:定義了請求類型、資源路徑和HTTP版本。
- 請求頭:包含關于客戶端、請求本身的各種元信息。
- 請求體:包含發送給服務器的數據(常用于POST, PUT等方法)。
1.2 HTTP響應報文(Response)
HTTP/1.1 200 OK // 狀態行:協議版本、狀態碼、狀態消息
Content-Type: application/json // 響應頭 (Headers)
Content-Length: 123
Cache-Control: max-age=3600
Set-Cookie: sessionId=abc123;...// 空行 (CRLF),分隔頭部和體
{"id": 1, "name": "John"} // 響應體 (Body),包含請求的資源或數據
- 狀態行:告知客戶端請求的處理結果。
- 響應頭:包含關于服務器、響應本身的各種元信息。
- 響應體:包含服務器返回給客戶端的實際數據。
1.3 報文解析代碼示例
# 簡單的HTTP解析示例
def parse_http_request(request_data):lines = request_data.split('\r\n')# 解析請求行request_line = lines[0]method, path, version = request_line.split(' ')# 解析頭部headers = {}for line in lines[1:]:if line == '': # 空行,頭部結束breakif ': ' in line:key, value = line.split(': ', 1)headers[key] = value# 解析主體body = ''if '\r\n\r\n' in request_data:body = request_data.split('\r\n\r\n', 1)[1]return {'method': method,'path': path, 'version': version,'headers': headers,'body': body}
2. HTTP方法(Methods)
2.1 常用方法
方法 | 作用 | 冪等性 | 安全性 |
---|---|---|---|
GET | 只讀,獲取資源 | 是 | 是 |
POST | 創建資源 | 否 | 否 |
PUT | 更新資源 | 是 | 否 |
DELETE | 刪除資源 | 是 | 否 |
HEAD | 獲取頭部 | 是 | 是 |
PATCH | 部分更新 | 否 | 否 |
OPTIONS | 查詢支持方法 | 是 | 是 |
重點:
- 冪等性 (Idempotent):多次執行相同的請求,產生的效果與一次執行相同。(GET, PUT, DELETE是冪等的;POST不是)。
- 安全性 (Safe):方法不會修改服務器上的資源。(GET, HEAD是安全的)。
2.2 方法特性詳解
# RESTful API設計示例
class UserAPI:# GET /users - 獲取用戶列表def get_users(self):pass# POST /users - 創建新用戶def create_user(self, data):pass# GET /users/123 - 獲取特定用戶def get_user(self, user_id):pass# PUT /users/123 - 更新整個用戶def update_user(self, user_id, data):pass# PATCH /users/123 - 部分更新用戶def patch_user(self, user_id, data):pass# DELETE /users/123 - 刪除用戶def delete_user(self, user_id):pass
3. HTTP狀態碼(Status Codes)
3.1 狀態碼分類
狀態碼 | 類別 | 常見狀態碼及含義 |
---|---|---|
1xx | 信息性 | 100 Continue(客戶端應繼續發送請求體) |
2xx | 成功 | 200 OK(成功) 201 Created(資源創建成功) 204 No Content(成功,但無內容返回) |
3xx | 重定向 | 301 Moved Permanently(永久重定向) 302 Found(臨時重定向) 304 Not Modified(資源未修改,使用緩存) |
4xx | 客戶端錯誤 | 400 Bad Request(請求語法錯誤) 401 Unauthorized(需要身份認證) 403 Forbidden(服務器拒絕請求) 404 Not Found(資源不存在) 429 Too Many Requests(請求過于頻繁) |
5xx | 服務器錯誤 | 500 Internal Server Error(服務器內部錯誤) 502 Bad Gateway(網關錯誤) 503 Service Unavailable(服務不可用) 504 Gateway Timeout(網關超時) |
4. HTTP緩存機制
緩存是Web性能優化的核心手段,主要分為強緩存和協商緩存。
1. 強緩存
瀏覽器直接判斷緩存是否過期,未過期則直接使用本地緩存,不發請求到服務器。
- 響應頭:
Cache-Control: max-age=3600
(相對時間,單位秒,優先級更高)Expires: Wed, 21 Oct 2024 07:28:00 GMT
(絕對時間,HTTP/1.0)
2. 協商緩存
瀏覽器發現緩存已過期,發送請求詢問服務器資源是否還能用。如果可用,服務器返回304,瀏覽器繼續用緩存。
- 請求/響應頭:
Last-Modified
(服務器告知的資源最后修改時間) /If-Modified-Since
(瀏覽器再次詢問時帶上的時間)Etag
(服務器告知的資源唯一標識,如哈希值) /If-None-Match
(瀏覽器再次詢問時帶上的標識,優先級更高)
緩存流程:
graph TDA[瀏覽器請求資源] --> B{是否有緩存?}B -- 無 --> C[直接向服務器請求]B -- 有 --> D{強緩存是否過期?}D -- 未過期 --> E[直接使用磁盤緩存]D -- 已過期 --> F[攜帶If-None-Match/If-Modified-Since<br>向服務器發起驗證]F --> G{服務器驗證資源是否變化?}G -- 未變化 304 --> H[更新緩存頭,使用緩存]G -- 已變化 200 --> I[返回新資源,更新緩存]
5. SSL/TLS握手過程
HTTPS = HTTP + SSL/TLS,在TCP和HTTP之間增加了一個安全層。
SSL/TLS握手核心目的:
- 協商加密套件(Cipher Suite)。
- 驗證服務器身份(可選驗證客戶端身份)。
- 安全地交換對稱加密密鑰(Session Key)。
簡化握手過程:
-
Client Hello (Client -> Server)
- 客戶端支持的TLS版本。
- 客戶端生成的隨機數
Random_C
。 - 客戶端支持的密碼套件列表(如RSA, ECDHE)。
-
Server Hello (Server -> Client)
- 選擇的TLS版本和密碼套件。
- 服務器生成的隨機數
Random_S
。 - 服務器的數字證書(包含公鑰)。
-
驗證與預主密鑰 (Client)
- 客戶端驗證證書的合法性(是否可信CA簽發、域名是否匹配、是否過期)。
- 客戶端生成第三個隨機數
Pre-Master Secret
,用證書中的服務器公鑰加密,發送給服務器。
-
生成會話密鑰 (Client & Server)
- 客戶端和服務器使用
Random_C
、Random_S
和Pre-Master Secret
,根據約定的算法各自獨立生成相同的對稱會話密鑰(Session Key)。后續通信都用這個密鑰加密。
- 客戶端和服務器使用
-
Finished
- 雙方交換加密后的Finished消息,驗證握手過程是否成功,加密通道是否已正確建立。
核心思想:非對稱加密(RSA/ECDHE)用于安全地交換對稱加密的密鑰(AES)。因為非對稱加密計算開銷大,不適合加密大量數據。
常見問題
Q1: GET和POST的區別?
答:GET用于獲取資源,冪等,參數在URL中,有長度限制;POST用于創建資源,非冪等,參數在body中,無長度限制。
Q2: HTTP緩存機制如何工作?
答:通過Cache-Control、Expires、ETag、Last-Modified等頭部控制,包含強制緩存和協商緩存兩種機制。
Q3: TLS握手為什么需要4次往返?
答:需要交換隨機數、協商參數、驗證證書、交換密鑰,確保通信的安全性和完整性。
Q4: 301和302重定向的區別?
答:301是永久重定向,瀏覽器會緩存;302是臨時重定向,瀏覽器不會緩存。
Q5: Content-Security-Policy的作用?
答:防止XSS攻擊,限制資源加載來源,指定允許執行的腳本源。
- 必背題:
- GET和POST的區別(安全、冪等、Body、緩存、歷史記錄)。
- 常見狀態碼的含義(200, 301, 302, 304, 400, 401, 403, 404, 500, 502)。
- 強緩存和協商緩存的流程和相關Header。
- 必會分析:
- 能完整描述TLS握手過程,并解釋為什么需要交換隨機數、為什么最終使用對稱加密。
- 能根據請求和響應頭分析一次HTTP請求的緩存行為。
- 深入問題:
- 對稱加密和非對稱加密的區別?TLS為什么兩者都用?
- 數字證書的作用是什么?它里面包含了什么?(公鑰、所有者信息、CA的簽名)
- HTTP/1.1 vs HTTP/2 的主要改進是什么?(多路復用、頭部壓縮、服務器推送)
總結
HTTP/HTTPS是現代Web的基石:
- ? HTTP協議:無狀態請求-響應協議,方法多樣,狀態碼豐富
- ? 緩存機制:提高性能,減少網絡流量,多種緩存策略
- ? HTTPS安全:TLS加密,證書驗證,保護數據傳輸安全
- ? 最佳實踐:安全頭部,性能優化,正確配置
4.Socket編程
//TODO: keep learning.