http工作流程

HTTP(Hypertext Transfer Protocol,超文本傳輸協議)是互聯網中客戶端與服務器之間傳輸超文本(如HTML、圖片、JSON等)的核心協議,基于請求-響應模型TCP/IP協議族工作。其完整工作流程可拆解為以下9個核心步驟,涵蓋從用戶觸發請求到最終資源展示的全鏈路細節:

步驟1:用戶觸發請求(客戶端發起意圖)

HTTP交互的起點是用戶的操作,例如:

  • 在瀏覽器地址欄輸入URL(如https://www.example.com/index.html);
  • 點擊網頁中的鏈接、提交表單、加載圖片/CSS/JS等資源;
  • 手機App調用API接口(如GET /api/user)。

此時,客戶端(瀏覽器、App等)需要明確:要訪問的服務器是誰?要獲取的資源是什么?

步驟2:解析URL(確定目標服務器與資源路徑)

客戶端首先解析用戶輸入的URL(Uniform Resource Locator,統一資源定位符),提取關鍵信息以定位目標。URL的基本結構為:

[協議]://[域名/IP]:[端口]/[路徑]?[查詢參數]#[錨點]  

例如http://www.example.com:80/path/file.html?id=1#top中:

  • 協議http(或https,后者基于TLS加密);
  • 域名/IPwww.example.com(需轉換為IP地址);
  • 端口80(HTTP默認端口,可省略;HTTPS默認443);
  • 路徑/path/file.html(服務器上的資源路徑);
  • 查詢參數?id=1(向服務器傳遞的額外參數,如GET請求的參數);
  • 錨點#top(僅客戶端使用,用于定位頁面內位置,不發送給服務器)。

步驟3:DNS域名解析(將域名轉換為IP地址)

URL中的“域名”(如www.example.com)是人類易讀的標識,而計算機通信依賴IP地址(如192.168.1.1)。因此,客戶端需要通過DNS(域名系統) 將域名解析為IP地址,流程如下:

  1. 檢查本地緩存:客戶端(瀏覽器、操作系統)先查本地DNS緩存(如瀏覽器緩存、hosts文件、系統緩存),若有記錄直接使用。
  2. 遞歸查詢本地DNS服務器:若本地無緩存,客戶端向“本地DNS服務器”(如運營商提供的114.114.114.114)發送查詢請求(遞歸查詢:客戶端只等結果,不關心中間過程)。
  3. 迭代查詢根域名服務器:本地DNS服務器若無記錄,會向“根域名服務器”(全球共13組)查詢。根服務器返回頂級域名服務器(如.com服務器)的地址。
  4. 查詢頂級域名服務器:本地DNS服務器向.com服務器查詢example.com的權威服務器地址。
  5. 查詢權威域名服務器:本地DNS服務器向example.com的權威服務器查詢www.example.com的IP地址,最終獲取結果。
  6. 返回結果并緩存:本地DNS服務器將IP地址返回給客戶端,并緩存該記錄(緩存時間由域名的TTL(Time To Live)決定,通常幾分鐘到幾小時)。

舉例www.example.com最終解析為203.0.113.5

步驟4:建立TCP連接(基于三次握手)

HTTP協議依賴TCP(傳輸控制協議) 提供可靠的字節流傳輸(保證數據不丟失、不重復、按序到達)。因此,客戶端需先與服務器的目標端口(如80)建立TCP連接,通過三次握手實現:

  1. 第一次握手(客戶端→服務器):客戶端發送SYN(同步)報文,包含一個隨機序列號(如seq=100),表示“我要連接你”。
  2. 第二次握手(服務器→客戶端):服務器接收SYN后,回復SYN+ACK(同步+確認)報文,包含:
    • 確認號ack=101(客戶端序列號+1,表示已收到客戶端的SYN);
    • 服務器自己的隨機序列號seq=200
  3. 第三次握手(客戶端→服務器):客戶端接收SYN+ACK后,回復ACK(確認)報文,包含確認號ack=201(服務器序列號+1,表示已收到服務器的SYN)。

三次握手完成后,TCP連接建立,雙方可開始傳輸數據。

注意

  • HTTP/1.0默認“非持久連接”(每次請求后關閉TCP連接);
  • HTTP/1.1默認“持久連接”(Keep-Alive,連接保持一段時間復用,減少握手開銷);
  • HTTP/2通過“多路復用”在一個TCP連接上并行處理多個請求;
  • HTTP/3基于QUIC協議(UDP),無需三次握手,連接建立更快。

步驟5:客戶端構建并發送HTTP請求報文

TCP連接建立后,客戶端向服務器發送HTTP請求報文,包含“要做什么”“要什么資源”等信息。請求報文結構由4部分組成:

1. 請求行(Request Line)

格式:[請求方法] [請求URI] [HTTP版本]

  • 請求方法:表示客戶端對資源的操作意圖,常見包括:
    • GET:獲取資源(如頁面、圖片,參數在URL中,無請求體);
    • POST:提交數據(如表單,參數在請求體中,更安全);
    • PUT:更新資源(全量替換);
    • DELETE:刪除資源;
    • HEAD:類似GET,但只返回響應頭(用于檢查資源是否存在)。
  • 請求URI:服務器上的資源路徑(如/path/file.html)。
  • HTTP版本:如HTTP/1.1(主流)、HTTP/2

示例GET /index.html HTTP/1.1

2. 請求頭(Request Headers)

由多個“鍵值對”組成(格式:Key: Value),用于傳遞客戶端信息、請求附加條件等,常見字段:

  • Host:目標服務器域名(如www.example.com,HTTP/1.1必需,用于虛擬主機區分);
  • User-Agent:客戶端標識(如Mozilla/5.0 (Windows NT 10.0; ...),服務器可據此返回適配內容);
  • Accept:客戶端可接受的資源類型(如text/html, application/json);
  • Accept-Encoding:客戶端支持的壓縮方式(如gzip, deflate,服務器可壓縮響應體減小傳輸量);
  • Cookie:客戶端存儲的鍵值對(如sessionid=abc123,用于身份識別,由服務器通過Set-Cookie設置);
  • Connection: Keep-Alive:請求保持TCP連接(HTTP/1.1默認)。

示例

Host: www.example.com  
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)  
Accept: text/html,application/xhtml+xml  
Cookie: username=test; sessionid=abc123  
3. 空行

一個單獨的CRLF(回車+換行,\r\n),用于分隔請求頭和請求體。

4. 請求體(Request Body)

可選,僅在POST/PUT等方法中存在,用于傳遞數據(如表單數據、JSON)。

  • 表單數據(Content-Type: application/x-www-form-urlencoded):username=test&password=123
  • JSON數據(Content-Type: application/json):{"username":"test","password":"123"}

完整請求報文示例

GET /index.html HTTP/1.1  
Host: www.example.com  
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)  
Accept: text/html,application/xhtml+xml  
Cookie: username=test; sessionid=abc123  (空行)  
(GET方法無請求體)  

步驟6:服務器接收并處理請求

服務器(如Nginx、Apache、Tomcat)通過監聽端口(如80)接收請求報文后,按以下流程處理:

  1. 解析請求報文:提取請求方法、URI、版本、請求頭、請求體等信息。
  2. 驗證請求合法性
    • 檢查Host是否匹配服務器配置(虛擬主機場景);
    • 驗證權限(如Cookie中的session是否有效,是否登錄);
    • 檢查請求格式(如Content-Length是否與請求體長度一致)。
  3. 定位資源并處理
    • 靜態資源(如.html.jpg):直接從服務器文件系統讀取(如Nginx直接返回/var/www/html/index.html);
    • 動態資源(如API接口):通過CGI、FastCGI、WSGI等接口調用后端程序(如Python的Django、Java的Spring),執行邏輯(如查詢數據庫、處理數據)。
  4. 生成響應內容:后端程序處理完成后,生成響應數據(如HTML頁面、JSON結果),返回給服務器。

步驟7:服務器構建并發送HTTP響應報文

服務器處理完成后,向客戶端返回HTTP響應報文,包含“處理結果”“返回資源”等信息。響應報文結構與請求報文類似,由4部分組成:

1. 狀態行(Status Line)

格式:[HTTP版本] [狀態碼] [原因短語]

  • HTTP版本:如HTTP/1.1
  • 狀態碼:3位數字,表示請求處理結果,分為5類:
    • 1xx(信息):請求已接收,繼續處理(如100 Continue);
    • 2xx(成功):請求正常處理(如200 OK);
    • 3xx(重定向):需進一步操作(如301 Moved Permanently永久重定向,302 Found臨時重定向);
    • 4xx(客戶端錯誤):請求有誤(如404 Not Found資源不存在,403 Forbidden權限不足);
    • 5xx(服務器錯誤):服務器處理失敗(如500 Internal Server Error)。
  • 原因短語:狀態碼的文字描述(如OK對應200)。

示例HTTP/1.1 200 OK

2. 響應頭(Response Headers)

傳遞服務器信息、響應附加條件等,常見字段:

  • Content-Type:響應體的MIME類型(如text/html; charset=utf-8表示HTML文本,image/jpeg表示JPG圖片);
  • Content-Length:響應體的字節長度(客戶端可據此判斷是否接收完整);
  • Content-Encoding:響應體的壓縮方式(如gzip,客戶端需解壓);
  • Set-Cookie:服務器向客戶端設置Cookie(如sessionid=abc123; Path=/; Max-Age=3600);
  • Cache-Control:緩存控制(如max-age=3600表示客戶端可緩存1小時);
  • Location:重定向的目標URL(配合3xx狀態碼使用)。

示例

Content-Type: text/html; charset=utf-8  
Content-Length: 1024  
Set-Cookie: sessionid=def456; Path=/; Max-Age=3600  
Cache-Control: max-age=3600  
3. 空行

同樣是CRLF,分隔響應頭和響應體。

4. 響應體(Response Body)

服務器返回的實際資源內容,如:

  • HTML文本(<html><body>Hello</body></html>);
  • JSON數據({"code":200,"data":"success"});
  • 二進制數據(圖片、視頻等)。

完整響應報文示例

HTTP/1.1 200 OK  
Content-Type: text/html; charset=utf-8  
Content-Length: 150  
Set-Cookie: sessionid=def456; Path=/; Max-Age=3600  (空行)  
<html>  <head><title>Example</title></head>  <body>Hello, World!</body>  
</html>  

步驟8:客戶端接收并解析響應

客戶端(如瀏覽器)接收響應報文后,按以下邏輯處理:

  1. 解析狀態碼:判斷請求是否成功(如200則繼續,404則顯示“頁面不存在”)。
  2. 處理響應頭
    • 若有Set-Cookie,則保存Cookie到本地(用于后續請求);
    • 若有Cache-Control,則緩存響應體(下次請求可直接使用緩存);
    • 若狀態碼為3xx,則根據Location重定向到新URL。
  3. 解析響應體
    • 瀏覽器:渲染HTML(解析DOM)、執行JS、加載CSS/圖片等(這些資源可能觸發新的HTTP請求);
    • App:解析JSON/XML數據,更新界面。

步驟9:關閉或復用TCP連接

響應處理完成后,TCP連接的生命周期取決于HTTP版本:

  • HTTP/1.0(非持久連接):默認每次請求后關閉連接,通過四次揮手

    1. 客戶端發送FIN(結束)報文;
    2. 服務器回復ACK確認;
    3. 服務器發送FIN報文;
    4. 客戶端回復ACK確認。
  • HTTP/1.1(持久連接):默認開啟Keep-Alive(可通過Connection: close關閉),連接保持一段時間(如30秒),期間客戶端可復用連接發送新請求,減少握手開銷。

  • HTTP/2:通過“多路復用”在一個TCP連接上并行處理多個請求(無需等待前一個請求完成),效率更高。

  • HTTP/3:基于QUIC協議(UDP),連接建立更快(無需三次握手),且支持“連接遷移”(網絡切換時不中斷連接)。

總結

HTTP工作流程是“客戶端發起請求→DNS解析→TCP連接→請求報文傳輸→服務器處理→響應報文返回→客戶端解析→連接管理”的閉環,每個環節都依賴具體的協議規則(如DNS解析、TCP握手、HTTP報文格式)。理解這一流程有助于排查網絡問題(如404錯誤、連接超時)、優化性能(如復用連接、合理緩存)。

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

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

相關文章

正則表達式實用面試題與代碼解析專欄

正則表達式是前端表單驗證、字符串匹配的核心工具,簡潔高效的正則能大幅提升代碼性能。本專欄整理了7道高頻面試題,包含核心正則表達式、代碼實現及關鍵知識點解析,幫你快速掌握正則實用技巧。 一、正則基礎:核心概念與語法 在學習面試題前,先明確幾個高頻基礎語法,這是…

【數據可視化-89】基孔肯雅熱病例數據分析與可視化:Python + pyecharts洞察疫情動態

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

云智智慧停充一體云-allnew全新體驗-路內停車源碼+路外停車源碼+充電樁源碼解決方案

采用Java主流的微服務技術棧&#xff0c;基于 Spring Cloud Alibaba 的微服務解決方案進行封裝的快速開發平臺&#xff0c;包含多種常用開箱即用功能的模塊&#xff0c;通用技術組件與服務、微服務治理&#xff0c;具備RBAC功能、網關統一鑒權、Xss防跨站攻擊、自動生成前后端代…

利用pypy加速pyxlsbwriter生成xlsb文件

上文介紹了python通過DuckDB和pyxlsbwriter模塊生成xlsb文件&#xff0c;因為python是解釋執行&#xff0c;它的速度有點慢&#xff0c;pypy是另一種python解釋器&#xff0c;它使用即時編譯&#xff08;JIT&#xff09;技術來提高執行速度。 因為DuckDB與pypy不兼容&#xff0…

【Java后端】Spring Boot 集成 MyBatis-Plus 全攻略

Spring Boot 集成 MyBatis-Plus 全攻略 1. 為什么選擇 MyBatis-Plus 零侵入&#xff1a;在 MyBatis 基礎上增強&#xff0c;不影響現有功能。內置 CRUD&#xff1a;無需寫 XML/SQL&#xff0c;直接調用 BaseMapper 方法。強大插件&#xff1a;分頁插件、性能分析、樂觀鎖、多租…

LangChain 多任務應用開發

Q: LangChain dify coze是競品關系 都是AI Agent搭建平臺&#xff0c;dify和coze 屬于低代碼&#xff0c;langChain屬于高代碼&#xff0c;coze優于dify Q&#xff1a;向量數據庫是存儲向量&#xff0c;做相似度檢索的&#xff0c;可以用faiss milvus chromdb Q&#xff1a;使用…

實用技巧:Oracle中精準查看表占用空間大小

目錄實用技巧&#xff1a;Oracle中精準查看表占用空間大小一、為什么需要精準統計表空間占用&#xff1f;二、完整查詢SQL&#xff1a;覆蓋表、LOB、索引三、SQL語句關鍵邏輯解析1. 基礎表&#xff1a;dba_tables 與 dba_tablespaces2. 子查詢1&#xff1a;統計表段空間&#x…

openEuler等Linux系統中如何復制移動硬盤的數據

在 openEuler 系統中,提示 “You should mount volume first” ,意思是需要先掛載移動硬盤的分區才能訪問: 安裝必要軟件(針對特殊文件系統) 如果移動硬盤是 NTFS 等非 Linux 原生支持的文件系統格式,需要安裝對應的支持軟件,以掛載 NTFS 格式移動硬盤為例,需要安裝 …

java如何把字符串數字轉換成數字類型

在Java中將字符串數字轉換為數字類型有多種方法&#xff0c;以下是詳細說明和示例代碼&#xff1a; 一、基礎轉換方法 Integer.parseInt() String str "123"; int num Integer.parseInt(str); // 轉換為intDouble.parseDouble() String str "3.14"; dou…

WPFC#超市管理系統(6)訂單詳情、顧客注冊、商品銷售排行查詢和庫存提示、LiveChat報表

WPF&C#超市管理系統10. 訂單詳情10.1 頁面布局10.2 功能實現11. 顧客注冊12. 商品銷售排行查詢與庫存提示14. LiveChart報表總結10. 訂單詳情 10.1 頁面布局 頁面分三行布置&#xff0c;第一行復用OutstorageView界面的第一行&#xff0c;將屬性和命令修改為顧客相關第二…

【Linux】文件基礎IO

1.關于文件的共識原理 1.文件內容屬性 2.文件分為打開的文件和沒打開的文件 3.打開的文件&#xff1a; 文件被打開必須先被加載到內存&#xff0c;所以本質是研究進程和文件的關系&#xff0c;一個進程可以打開多個文件。操作系統內部一定存在大量被打開的文件&#xff0c;要進…

基于微信小程序的生態農產銷售管理的設計與實現/基于C#的生態農產銷售系統的設計與實現、基于asp.net的農產銷售系統的設計與實現

基于微信小程序的生態農產銷售管理的設計與實現/基于C#的生態農產銷售系統的設計與實現、基于asp.net的農產銷售系統的設計與實現

Java研學-SpringCloud(五)

一 Nacos 配置中心 1 引入依賴 – services.pom每個微服務都需要<!--配置中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>2 配置文件 –…

.NET 中的延遲初始化:Lazy<T> 與LazyInitializer

標簽&#xff1a;線程安全、延遲初始化、按需初始化、提升啟動性能 項目地址&#xff1a;NitasDemo/12Lazy/LazyDemo at main Nita121388/NitasDemo 目錄Lazy<T>1. 概念2. 基本用法 3. 異常處理 4. 線程安全模式 5. 示例1. 線程安全模式 (ExecutionAndPublication)2. 發…

【LLIE專題】LLIE低照度圖像結構先驗提取方法

Zero-Shot Day-Night Domain Adaptation with a Physics Prior&#xff08;ICCV,2021&#xff09;專題介紹一、研究背景二、方法1. 物理反射模型與顏色不變特征的推導&#xff08;原理推導、物理依據&#xff09;2. 顏色不變特征的計算&#xff08;特征計算公式整個過程&#x…

Font Awesome Kit 使用詳解

在現代網頁設計中&#xff0c;圖標是提升用戶體驗的關鍵元素。而 Font Awesome 作為最受歡迎的圖標庫&#xff0c;其最新版本 Font Awesome 7 通過 Kit 功能提供了更便捷高效的集成方式。本文將帶你全面了解如何使用 Font Awesome Kit&#xff0c;讓你的網站圖標管理變得輕松高…

第七十八章:AI的“智能美食家”:輸出圖像風格偏移的定位方法——從“濾鏡病”到“大師風范”!

AI圖像風格偏移前言&#xff1a;AI的“火眼金睛”——輸出圖像風格偏移的定位方法&#xff01;第一章&#xff1a;痛點直擊——“畫風跑偏”&#xff1f;AI生成藝術的“審美危機”&#xff01;第二章&#xff1a;探秘“畫風密碼”&#xff1a;什么是風格偏移&#xff1f;它藏在…

Android原生(Kotlin)與Flutter混合開發 - 設備控制與狀態同步解決方案

Kotlin 原生實現 (Android) 1.1 AndroidManifest.xml <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"com.afloia.smartconnect"><applicationandroid:name".MainApplication"android:label"Smart …

已開源:Highcharts.NET,Highcharts Android,與Highcharts iOS集成

近期了解到&#xff0c;Highcharts官方宣布將Highcharts.NET&#xff0c;Highcharts Android&#xff0c;與Highcharts iOS集成轉換為開源。對于Highcharts提供世界一流的數據可視化工具&#xff0c;一直致力于將資源集中在可以為您提供最大價值的地方。官方提到&#xff1a;這…

KingbaseES:一體化架構與多層防護,支撐業務的持續穩定運行與擴展

聲明&#xff1a;文章為本人真實測評博客&#xff0c;非廣告 目錄 引言 一、什么是KingbaseES&#xff1f; 二、KingbaseES核心特性 1. 一鍵遷移&#xff0c;極速性能&#xff0c;安全無憂? 2. 性能強勁&#xff0c;擴展性強&#xff0c;助力企業應對大規模并發挑戰? …