3.HTTP/HTTPS:報文格式、方法、狀態碼、緩存、SSLTLS握手

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握手核心目的:
  1. 協商加密套件(Cipher Suite)。
  2. 驗證服務器身份(可選驗證客戶端身份)。
  3. 安全地交換對稱加密密鑰(Session Key)。
簡化握手過程:
  1. Client Hello (Client -> Server)

    • 客戶端支持的TLS版本。
    • 客戶端生成的隨機數 Random_C
    • 客戶端支持的密碼套件列表(如RSA, ECDHE)。
  2. Server Hello (Server -> Client)

    • 選擇的TLS版本和密碼套件。
    • 服務器生成的隨機數 Random_S
    • 服務器的數字證書(包含公鑰)。
  3. 驗證與預主密鑰 (Client)

    • 客戶端驗證證書的合法性(是否可信CA簽發、域名是否匹配、是否過期)。
    • 客戶端生成第三個隨機數 Pre-Master Secret,用證書中的服務器公鑰加密,發送給服務器。
  4. 生成會話密鑰 (Client & Server)

    • 客戶端和服務器使用 Random_CRandom_SPre-Master Secret,根據約定的算法各自獨立生成相同的對稱會話密鑰(Session Key)。后續通信都用這個密鑰加密。
  5. 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攻擊,限制資源加載來源,指定允許執行的腳本源。

  1. 必背題
    • GET和POST的區別(安全、冪等、Body、緩存、歷史記錄)。
    • 常見狀態碼的含義(200, 301, 302, 304, 400, 401, 403, 404, 500, 502)。
    • 強緩存和協商緩存的流程和相關Header
  2. 必會分析
    • 能完整描述TLS握手過程,并解釋為什么需要交換隨機數、為什么最終使用對稱加密。
    • 能根據請求和響應頭分析一次HTTP請求的緩存行為
  3. 深入問題
    • 對稱加密和非對稱加密的區別?TLS為什么兩者都用?
    • 數字證書的作用是什么?它里面包含了什么?(公鑰、所有者信息、CA的簽名)
    • HTTP/1.1 vs HTTP/2 的主要改進是什么?(多路復用、頭部壓縮、服務器推送)

總結

HTTP/HTTPS是現代Web的基石:

  • ? HTTP協議:無狀態請求-響應協議,方法多樣,狀態碼豐富
  • ? 緩存機制:提高性能,減少網絡流量,多種緩存策略
  • ? HTTPS安全:TLS加密,證書驗證,保護數據傳輸安全
  • ? 最佳實踐:安全頭部,性能優化,正確配置

4.Socket編程

//TODO: keep learning.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/96040.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/96040.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/96040.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【慢教程】Ollama4:ollama命令匯總

??教程說明 Ollama 是一款輕量級本地大模型部署工具&#xff0c;使用廣泛&#xff0c;且容易上手&#xff0c;適合作為AI技術的入門。 &#x1f9e9;教程各部分鏈接&#xff1a; 第一課&#xff1a;ollama運行原理介紹及同類工具對比 ollama運行原理介紹及同類工具對比&am…

JAVA Predicate

簡單來說&#xff0c;當我明確知道此次判斷的邏輯時就可以直接使用if&#xff0c;但是我這次的判斷邏輯可能會隨著某個參數變化的時候使用Predicate比如當我想要判斷某長段文字中是否包含list<String> 中的元素&#xff0c;并且包含的元素個數大于 list<String>最后…

什么是PFC控制器

一句話概括PFC控制器是一種智能芯片&#xff0c;它通過控制電路中的電流波形&#xff0c;使其與電壓波形保持一致&#xff0c;從而減少電力浪費&#xff0c;提高電能的利用效率。PFC控制器IC的核心作用就是控制一顆功率MOSFET的開關&#xff0c;通過特定的電路拓撲&#xff08;…

【P03_AI大模型測試之_定制化 AI 應用程序開發】

git clone https://gitee.com/winner21/aigc-test.git 類似于joycoder的&#xff0c;可以安裝在vscode上的通義靈碼&#xff1a;https://lingma.aliyun.com/ 1、VSCODE上配置通義靈碼 2、創建前后端文件&#xff0c;并引用AI編碼代碼 3、指定文件&#xff0c;利用AI進行代碼優…

人工智能機器學習——決策樹、異常檢測、主成分分析(PCA)

一、決策樹(Decision Tree) 決策樹&#xff1a;一種對實例進行分類的樹形結構&#xff0c;通過多層判斷區分目標所屬類別 本質&#xff1a;通過多層判斷&#xff0c;從訓練數據集中歸納出一組分類規則 優點&#xff1a; 計算量小&#xff0c;運算速度快易于理解&#xff0c;可…

服務器文件同步用哪個工具?介紹一種安全高效的文件同步方案

服務器作為企業核心數據和應用的載體&#xff0c;服務器文件同步已成為IT運維、數據備份、業務協同中不可或缺的一環。然而&#xff0c;面對多樣的場景和嚴苛的需求&#xff0c;選擇一個既高效又安全的服務器文件同步工具并非易事。本文將首先探討服務器文件同步的常見場景、需…

LeetCode 004. 尋找兩個正序數組的中位數 - 二分切分與分治詳解

一、文章標題 LeetCode 004. 尋找兩個正序數組的中位數 - 二分切分與分治詳解 二、文章內容 1. 題目概述 題目描述&#xff1a;給定兩個已按非降序排列的整數數組 nums1、nums2&#xff0c;設它們長度分別為 m 和 n&#xff0c;要求返回這兩個數組合并后有序序列的中位數。…

預閃為什么可以用來防紅眼?

打閃拍照紅眼產生的原因 預閃可以用來防紅眼&#xff0c;是基于人眼的生理特性和紅眼現象的產生原理。在光線較暗時&#xff0c;人眼的瞳孔會放大。當使用閃光燈拍攝時&#xff0c;如果直接進行高強度閃光&#xff0c;由于瞳孔來不及縮小&#xff0c;閃光燈的光線會反射在眼球血…

Python程序使用了Ffmpeg,結束程序后,文件夾中仍然生成音頻、視頻文件

FFmpeg是一套可以用來記錄、轉換數字音頻、視頻&#xff0c;并能將其轉化為流的開源計算機程序。采用LGPL或GPL許可證。它提供了錄制、轉換以及流化音視頻的完整解決方案。它包含了非常先進的音頻/視頻編解碼庫libavcodec&#xff0c;為了保證高可移植性和編解碼質量&#xff0…

模塊與包的導入

077-模塊-06-模塊搜索順序_嗶哩嗶哩_bilibili 080-包-01-包的概念以及建立包的方式_嗶哩嗶哩_bilibili 088-文件操作-01-文件操作套路以及Python中的對應函數和方法_嗶哩嗶哩_bilibili 注&#xff1a; 1.import math和 from math import *區別 2. 模塊&#xff08;Module…

Docker Compose 多種安裝方式 (Alibaba Cloud Linux 3 環境)

Docker Compose 多種安裝方式&#xff0c;適用于不同場景&#xff08;如依賴系統包管理器、使用 Python 工具鏈、集成 Docker 插件等&#xff09;。以下是常見的方案&#xff0c;尤其針對 Alibaba Cloud Linux 3 環境適配&#xff1a; 一、二進制包安裝&#xff08;推薦&#…

Dubbo3序列化安全機制導致的一次生產故障

前言 記錄一次 Dubbo 線上故障排查和原因分析。 線上 Dubbo 消費者啟動有錯誤日志如下&#xff0c;但是不影響服務啟動。 java.lang.TypeNotPresentException: Type org.example.model.ThirdParam not present ... Caused by: java.lang.ClassNotFoundException: org.example.m…

centos7 docker離線安裝

介紹 本文主要講了如何在完全沒網的情況下安裝docker&#xff08;適合于高網絡安全要求的企業&#xff09; 本文適用的centos版本&#xff1a; [root0001 temp]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 采用docker in docker下載依賴 實際試驗后&…

東京本社招聘 | 財務負責人 多個日本IT崗位(Java/C++/Python/AWS 等),IT營業同步招募

大家好&#xff0c;本期為大家帶來我司在東京GSD本社及其他會社千葉地區的招聘崗位。 涵蓋 財務負責人、Java開發工程師、數據中心維護工程師、項目經理、IT營業 等多個職位。 歡迎有志之士加入&#xff01;&#x1f539; 財務負責人&#xff08;東京本社&#xff09;工作內容日…

四數之和

目錄 一&#xff1a;題目鏈接 二&#xff1a;題目思路 三&#xff1a;代碼實現 一&#xff1a;題目鏈接 理解題目需要注意&#xff0c;如果兩個四元組元素一一對應&#xff0c;則認為兩個四元組重復&#xff0c;選擇其中一個四元組即可。比如 [ 0 , 1 , 0 , 2] 和 [ 1 , …

【序列晉升】29 Spring Cloud Task 微服務架構下的輕量級任務調度框架

Spring Cloud Task作為微服務架構中的輕量級任務調度框架&#xff0c;為開發人員提供了一種構建短生命周期微服務任務的便捷方式。它允許開發者快速創建、執行和管理一次性任務或短期批處理作業&#xff0c;任務執行完成后自動關閉以釋放系統資源&#xff0c;避免了傳統長期運行…

【1分鐘速通】 HTML快速入門

HTML&#xff08;HyperText Markup Language&#xff0c;超文本標記語言&#xff09; 是構建網頁的基礎語言。它通過 標簽&#xff08;Tag&#xff09; 來描述網頁的結構和內容&#xff0c;常與 CSS&#xff08;負責樣式 – <style></style>&#xff09;和 JavaScr…

【GeoServer】WMS GetFeatureInfo URL 逐個參數解釋

我來把你構造的這個 WMS GetFeatureInfo URL 逐個參數解釋一下&#xff0c;方便你理解&#xff1a;http://127.0.0.1:8090/geoserver/xxxx/wms? SERVICEWMS& VERSION1.1.1& REQUESTGetFeatureInfo& QUERY_LAYERSloess:yourLayer& LAYERSloess:yourLayer& …

OBS直播教程:點歌直播間怎么弄?直播點歌用什么軟件?

OBS直播教程&#xff1a;點歌直播間怎么弄&#xff1f;直播點歌用什么軟件&#xff1f; 第一步&#xff1a;安裝OBS直播軟件&#xff0c;如果你電腦已經安裝了OBS&#xff0c;請直接看第二步 OBS直播軟件下載地址①&#xff1a; https://d.obscj.com/obs-Studio-29.1.3-Full-…

【數據庫】Redis詳解:內存數據庫與緩存之王

什么是Redis&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的、基于內存的數據結構存儲系統&#xff0c;可以用作數據庫、緩存和消息代理。它支持多種數據結構&#xff0c;如字符串、哈希、列表、集合、有序集合等&#xff0c;具有極高的性能和…