應用層協議:HTTP

目錄

HTTP:超文本傳輸協議

1.1 HTTP報文

1.1.1 請求報文

1.1.2 響應報文

1.2 HTTP請求過程和原理

1.2.1 請求過程

1、域名(DNS)解析

2、建立TCP連接(三次握手)

3、發送HTTP請求

4、服務器處理請求

5、返回HTTP響應

6、瀏覽器渲染(客戶端側)

7、斷開TCP連接(四次揮手)

1.2.2 核心原理

1.3 HTTP的不同版本

1.3.1 HTTP1.0

1.3.2 HTTP1.1(常用)

1.3.3 HTTP2.0(常用)

1.3.4 HTTP3.0


應用層協議是網絡模型中最高層的協議,直接為用戶應用程序提供服務,定義了應用程序之間如何進行通信和數據交換的規則。

HTTP:超文本傳輸協議

  • 功能:?HTTP 是用于在 HTTP 應用程序(Web 瀏覽器和 Web 服務器)之間傳輸超文本文檔(如 HTML 文件)的基礎協議。它定義了客戶端(瀏覽器)如何請求資源(如網頁、圖片)以及服務器如何響應這些請求。它是一種無狀態協議(服務器默認不記住之前的請求)。

無狀態:HTTP 協議本身不保留之前請求或響應的任何信息。

  • 端口:?HTTP - 80

1.1 HTTP報文

  • HTTP 請求 (HTTP Request):?客戶端向服務器發送一個格式化的消息,說明它想要什么(例如,“給我 index.html 頁面” 或 “把這個表單數據提交到服務器”)。

  • HTTP 響應 (HTTP Response):?服務器處理請求后,向客戶端返回一個格式化的消息,包含請求的結果(例如,返回 index.html 文件的內容,或告知表單提交成功/失敗)。

1.1.1 請求報文

請求行 (Request Line):

  • 方法 (Method):定義要對資源執行的操作(如?GET,?POST,?PUT,?DELETE,?HEAD,?OPTIONS?等)。

  • 請求目標 (Request Target):通常是資源的 URL 路徑(有時包含查詢參數),例如?/index.html?或?/search?q=term

  • HTTP 版本:如?HTTP/1.1

  • 示例:?GET /index.html HTTP/1.1

請求頭 (Request Headers):

  • 一系列鍵值對 (Header-Name: Header-Value),提供關于請求的額外信息。

  • 常見頭:

    • Host: 目標服務器的主機名和端口(必需,尤其在虛擬主機環境下)。

    • User-Agent: 客戶端標識(瀏覽器類型、版本、操作系統等)。

    • Accept: 客戶端可接受的響應內容類型(MIME 類型),如?text/html, application/json

    • Accept-Language: 客戶端接受的自然語言(如?en-US, zh-CN)。

    • Accept-Encoding: 客戶端接受的內容編碼(壓縮方式),如?gzip, deflate, br

    • Connection: 控制連接選項(如?keep-alive?表示希望保持連接)。

    • Cookie: 將之前服務器設置的 Cookie 發送回服務器。解決HTTP無狀態的問題。

    • sec-fetch-dest :期望獲得什么類型的資源
    • sec-fetch-mode navigate,表示這是一個瀏覽器的頁面切換請求?
    • sec-fetch-site:表示一個請求發起的來源和目標資源來源之間的關系,cross
      site :跨域請求, same-origin :同源請求。
    • sec-fetch-user :? 1 表示的true。
    • upgrade-insecure-requests :1,表示當前瀏覽器告訴服務器,瀏覽器是可以處理https 請求的,即使訪問的 https 請求中又包含了其他的http請求。
    • user-agent:描述瀏覽器的信息

    • Content-Type?(用于 POST/PUT 等):請求體(Body)的數據類型(如?application/x-www-form-urlencoded,?multipart/form-data,?application/json)。

    • Content-Length?(用于有 Body 的請求):請求體的大小(字節數)。

    • Authorization: 包含用于訪問受保護資源的憑證(如?Basic <credentials>,?Bearer <token>)。

空行 (Empty Line):

  • 分隔頭部和請求體。

請求體 (Request Body - 可選):

  • 包含發送給服務器的數據。主要用于?POST,?PUT,?PATCH?等方法提交表單數據、上傳文件或發送 JSON/XML 等結構化數據。

  • GET,?HEAD,?DELETE,?OPTIONS?等方法通常沒有請求體。

1.1.2 響應報文

狀態行 (Status Line):

  • HTTP 版本:如?HTTP/1.1

  • 狀態碼 (Status Code):一個三位數字代碼,表示請求處理結果(如?200 OK,?404 Not Found,?500 Internal Server Error)。

1xx (信息性響應):?表示請求已被接收,需要繼續處理。

  • 100 Continue: 客戶端應繼續發送請求體。

  • 101 Switching Protocols: 服務器應客戶端要求切換協議(如升級到 WebSocket)。

2xx (成功):?表示請求已成功被服務器接收、理解、并接受。

  • 200 OK:?請求成功。GET 請求返回資源,POST/PUT 請求返回操作結果。

  • 201 Created: 請求成功并創建了新資源(通常在 POST 或 PUT 后)。

  • 202 Accepted: 請求已接受處理,但處理尚未完成(異步操作)。

  • 204 No Content: 請求成功,但響應沒有內容(如 DELETE 成功)。

3xx (重定向):?表示需要客戶端采取進一步的操作才能完成請求。

  • 301 Moved Permanently: 請求的資源已永久移動到新 URL(Location 頭中)。客戶端應更新書簽。

  • 302 Found?(曾用名?Moved Temporarily): 請求的資源臨時移動到另一個 URL(Location 頭中)。客戶端本次應訪問新 URL,但以后仍可用舊 URL。

  • 304 Not Modified: 資源未被修改(用于緩存)。客戶端可直接使用緩存的版本。

  • 307 Temporary Redirect: 類似于 302,但要求客戶端必須保持原請求方法不變(如 POST 重定向后必須還是 POST)。

  • 308 Permanent Redirect: 類似于 301,但要求客戶端必須保持原請求方法不變

4xx (客戶端錯誤):?表示請求包含語法錯誤或無法完成。

  • 400 Bad Request: 請求語法錯誤或參數無效,服務器無法理解。

  • 401 Unauthorized: 請求需要用戶認證(登錄)。通常伴隨?WWW-Authenticate?頭。

  • 403 Forbidden: 服務器理解請求,但拒絕執行(權限不足)。

  • 404 Not Found: 服務器找不到請求的資源(URL 錯誤或資源已被刪除)。

  • 405 Method Not Allowed: 請求中使用的 HTTP 方法不被目標資源支持(如對只讀資源用 POST)。

  • 408 Request Timeout: 服務器在等待請求發送時超時

  • 429 Too Many Requests: 客戶端在規定時間內發送了過多請求(限流)。

5xx (服務器錯誤):?表示服務器在處理請求時發生錯誤。

  • 500 Internal Server Error:?服務器內部錯誤,無法完成請求(代碼崩潰、配置錯誤等)。

  • 501 Not Implemented: 服務器不支持完成請求所需的某個功能(如請求了一個未實現的方法)。

  • 502 Bad Gateway: 作為網關或代理的服務器,從上游服務器收到無效響應

  • 503 Service Unavailable: 服務器暫時過載或停機維護,無法處理請求(稍后重試)。

  • 504 Gateway Timeout: 作為網關或代理的服務器,未能及時從上游服務器獲得響應。

  • 狀態文本 (Reason Phrase):對狀態碼的簡短文字描述(如?OK,?Not Found)。

  • 示例:?HTTP/1.1 200 OK?或?HTTP/1.1 404 Not Found

響應頭 (Response Headers):

  • 一系列鍵值對,提供關于響應的額外信息。

  • 常見頭:

    • Server: 服務器軟件信息(如?Apache/2.4.41,?nginx/1.18.0)。

    • Date: 響應生成的日期和時間。

    • Content-Type: 響應體的數據類型(MIME 類型),如?text/html; charset=UTF-8,?image/jpeg,?application/json

    • Content-Length: 響應體的大小(字節數)。

    • Content-Encoding: 響應體使用的壓縮編碼(如?gzip),指示客戶端需要解壓。

    • Connection: 連接選項(如?keep-alive)。

    • Cache-Control: 指示客戶端和中間代理如何緩存此響應。

    • Set-Cookie: 服務器要求客戶端存儲一個或多個 Cookie。

    • Location: 在重定向響應(3xx)中,指定客戶端應跳轉的新 URL。

    • WWW-Authenticate: 在 401 Unauthorized 響應中,指定服務器要求的認證方式。

空行 (Empty Line):

  • 分隔頭部和響應體。

響應體 (Response Body - 可選):

  • 包含服務器返回給客戶端的實際數據內容。最常見的是 HTML 文檔,但也可能是圖片、視頻、CSS、JavaScript、JSON、XML 等。

  • 狀態碼為?204 No Content?或?304 Not Modified?的響應通常沒有響應體。

1.2 HTTP請求過程和原理

1.2.1 請求過程

1、域名(DNS)解析
  • 瀏覽器解析URL中的域名(如?www.example.com

  • 查詢本地DNS緩存 → 系統Hosts文件 → 遞歸查詢DNS服務器 → 獲取目標服務器的IP地址(如?93.184.216.34)。

2、建立TCP連接(三次握手)

  • 目的:確保雙方具備可靠數據傳輸能力。

  • 端口:HTTP默認?80

3、發送HTTP請求

瀏覽器構建 HTTP 請求,包括請求行、請求頭和請求體;然后將請求發送到服務器。

請求報文結構:

GET /index.html HTTP/1.1          // 請求行(方法+路徑+協議版本)
Host: www.example.com             // 必需頭部
User-Agent: Mozilla/5.0           // 客戶端標識
Accept: text/html                 // 可接受的響應類型
Connection: keep-alive            // 保持連接
(空行)                             // 頭部結束標記
(可選請求體,如POST提交的數據)       // GET請求無請求體
4、服務器處理請求
  • Web服務器(如Nginx/Apache)接收請求

  • 路由解析(匹配URL到具體處理程序)

  • 應用邏輯執行(如查詢數據庫)

  • 生成響應內容(HTML/JSON等)。

5、返回HTTP響應

響應報文結構:

HTTP/1.1 200 OK                     // 狀態行(協議版本+狀態碼)
Content-Type: text/html; charset=utf-8  // 響應數據類型
Content-Length: 1024                // 數據長度
Set-Cookie: session_id=abc123       // 會話管理
(空行)                               // 頭部結束標記
<!DOCTYPE html>                      // 響應體(實際數據)
<html>...</html>
6、瀏覽器渲染(客戶端側)
  • 解析HTML → 構建DOM樹

  • 加載CSS/JS → 渲染頁面

  • 執行JavaScript邏輯。

7、斷開TCP連接(四次揮手)
  • HTTP/1.1 默認?keep-alive(復用連接)

  • 超時或顯式關閉時觸發?TCP四次揮手

1.2.2 核心原理

1、無狀態協議

  • 每次請求獨立,服務器不保存客戶端狀態

  • 解決方案:Cookies/Session/JWT Token 維持會話狀態。

  • Cookies:服務器通過 Set-Cookie 響應頭將狀態信息存儲在客戶端,客戶端在后續請求中發送該 Cookie 以維持狀態。
  • Session:服務器生成一個唯一的會話 ID,存儲在 Cookie 中,并在服務器端維護與該會話 ID 關聯的狀態信息。
  • Token:使用 JWT(JSON Web Token)等機制在客戶端存儲狀態信息,客戶端在每次請求中發送該 Token。

2、持久連接(HTTP/1.1 Keep-Alive)

  • 單TCP連接處理多個請求/響應,減少握手開銷

  • 對比HTTP/1.0(每個請求新建連接)。

3、管道化技術(Pipelining)

  • 客戶端連續發送多個請求而不等響應

  • 實際因隊頭阻塞問題被棄用(必須按照請求相同的順序回送HTTP響應) → HTTP/2 多路復用解決。

1.3 HTTP的不同版本

1.3.1 HTTP1.0

非持久連接:默認情況下,每個 HTTP 請求/響應對之后,連接會被關閉,屬于短連接。這意味著對于同一個網站的每個資源請求,如 HTML 頁面上的圖片和腳本,都需要建立一個新的 TCP 連接。可以設置Connection: keep-alive?強制開啟長連接。

1.3.2 HTTP1.1(常用)

持久連接:HTTP 1.1 引入了持久連接(也稱為 HTTP keep-alive),默認情況下不會立即關閉連接,可以在一個連接上發送多個請求和響應。極大減輕了 TCP 連接的開銷。

持久連接的超時時間:

  • HTTP/1.1 規范本身沒有定義默認的 keep-alive 超時時間。

  • 實際的默認超時時間取決于使用的具體 Web 服務器軟件和 HTTP 客戶端庫/應用程序的配置。

  • 常見 Web 服務器的典型默認值范圍在 5 秒到 120 秒之間(例如 Nginx 默認為 75 秒)。

  • 客戶端(如瀏覽器)通常也有自己的默認值(可能幾分鐘)。

  • 服務器和客戶端可以通過?Keep-Alive: timeout=?頭部進行協商,最終超時通常由服務器決定或配置。

管道化處理:HTTP 1.1 支持客戶端在前一個請求的響應到達之前發送下一個請求,以提高傳輸效率。有隊頭阻塞問題(必須按照請求相同的順序回送HTTP響應)

1.3.3 HTTP2.0(常用)

二進制分幀將所有傳輸的信息分割為更小的消息和幀,并對它們采用二進制格式的編碼 ,其中HTTP1.x的首部信息會被封裝到Headers幀,而我們的request body則封裝到Data幀里面。幀是數據傳輸的最小單位, 以二進制傳輸代替原本的明文傳輸。這些幀可以亂序發送,然后再根據每個幀首部的流標識符重新組裝。

多路復用:一個 TCP 連接上可以同時進行多個 HTTP 請求/響應,解決了 HTTP 1.x 的隊頭阻塞問題。盡管從邏輯上來說,不同的流之間相互獨立,不會相互影響,但在實際傳輸的過程中,數據還是要一幀一幀的發送和接收,一旦某一個流的數據有丟包,仍然會阻塞在它之后傳輸的流數據。

頭部壓縮:HTTP 協議不帶狀態,所以每次請求都必須附上所有信息。HTTP 2.0 引入了頭部壓縮機制,可以使用 gzip 或 compress 壓縮后再發送,減少了冗余頭部信息的帶寬消耗。

服務端推送:服務器可以主動向客戶端推送資源,而不需要客戶端明確請求。

1.3.4 HTTP3.0

基于QUIC協議(UDP):HTTP/2.0 基于 TCP 協議,而 HTTP/3.0 則基于 QUIC 協議,Quick UDP Connections,直譯為快速 UDP 網絡連接。基于 UDP 的 QUIC 協議,讓不同的流之間真正的實現相互獨立傳輸,互不干擾。

版本核心改進解決的問題
HTTP/1.0支持Header、多種請求方法基礎標準化
HTTP/1.1持久連接、分塊傳輸TCP連接復用
HTTP/2二進制分幀、多路復用、頭部壓縮隊頭阻塞、性能優化
HTTP/3基于QUIC協議(UDP)、0-RTT握手TCP隊頭阻塞、延遲更低

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

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

相關文章

商務合同范本智能審核系統 AI 大模型處理方案

1. 項目概述與目標 目標: 構建一個基于AI大模型的智能合同審核系統,能夠自動解析商務合同范本,識別其中的法律風險點(如權責不對等、違約金比例異常、條款模糊、缺失必要條款等),并結合企業內部合規數據庫進行實時比對,提供專業的修改建議,大幅提升合同審查的效率和合…

Kafka 消息隊列

一、 消息隊列 1. 什么是消息隊列 消息(Message)是指在應用間傳送的數據。消息可以非常簡單&#xff0c;比如只包含文本字符串&#xff0c;也可以更復雜&#xff0c;可能包含嵌入對象。消息隊列(Message Queue)是一種應用間的通信方式&#xff0c;消息發送后可以立即返回&…

NodeJS全棧WEB3面試題——P3Web3.js / Ethers.js 使用

3.1 Ethers.js 和 Web3.js 的主要區別是什么&#xff1f; 比較點Ethers.jsWeb3.js體積更輕量&#xff0c;適合前端較大&#xff0c;加載慢&#xff0c;適合 Node文檔文檔簡潔、現代化&#xff0c;支持 TypeScript文檔豐富&#xff0c;但不夠現代化模塊化設計高度模塊化&#x…

Ubuntu 桌面版忘記賬戶密碼的重置方法

如果你忘記了 Ubuntu 桌面版的用戶密碼&#xff0c;可以通過進入恢復模式&#xff08;Recovery Mode&#xff09;來重置密碼。以下是詳細步驟&#xff1a; 一、進入 GRUB 引導菜單 重啟計算機&#xff1a;點擊關機按鈕&#xff0c;選擇重啟。在啟動時按住 Shift 鍵&#xff1…

全志A40i android7.1 調試信息打印串口由uart0改為uart3

一&#xff0c;概述 1. 目的 將調試信息打印串口由uart0改為uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改動 使能uart3(TX:PH00 RX:PH01)&#xff0c;并讓boo…

【五子棋在線對戰】二.項目結構設計 實用工具類模板的實現

項目結構設計 1.項目模塊劃分2.業務處理模塊子模塊的劃分3.實用工具類模板的實現3.1 日志宏的實現3.2 mysql工具3.3 JsonCpp工具3.4 string-Split工具 && file_util工具 1.項目模塊劃分 ● 數據管理模塊&#xff1a;依托 MySQL 數據庫&#xff0c;負責用戶數據的存儲與…

53 python akshare(獲取金融數據)

在金融數據獲取與分析領域,AkShare是一個強大且靈活的開源庫,它提供了豐富的金融數據接口,覆蓋股票、期貨、期權、基金、債券、外匯等多個金融市場。AkShare更專注于中國金融市場數據,并且支持從多個數據源獲取數據,具有更高的穩定性和更全面的數據覆蓋。 一、安裝akshar…

藍橋杯17114 殘缺的數字

問題描述 七段碼顯示器是一種常見的顯示數字的電子元件&#xff0c;它由七個發光管組成: 圖依次展示了數字 0~9 用七段碼來顯示的狀態&#xff0c;其中燈管為黃色表示點亮&#xff0c;灰色表示熄滅。根據燈管的亮暗狀態&#xff0c;我們可以用一個狀態碼(狀態碼是一個 7 位的…

Java觀察者模式深度解析:構建松耦合事件驅動系統的藝術

目錄 觀察者模式基礎解析核心結構與實現原理Java內置觀察者實現Spring框架中的高級應用典型應用場景與實戰案例觀察者模式變體與優化常見問題與最佳實踐總結與未來展望1. 觀察者模式基礎解析 1.1 模式定義與核心思想 觀察者模式(Observer Pattern)是一種行為型設計模式,它…

NocoBase v1.7.0 正式版發布

原文鏈接&#xff1a;https://www.nocobase.com/cn/blog/nocobase-1-7-0。 新特性 用戶角色并集 角色并集是一種權限管理模式&#xff0c;根據系統設置&#xff0c;系統開發者可以選擇使用獨立角色、允許角色并集&#xff0c;或者僅使用角色并集&#xff0c;以滿足不同的權限…

破解通信難題,modbus轉profibus網關在高爐水沖渣系統中穩定好用

基于在高爐水沖渣傳動監控系統的工藝背景下,穩聯技術Profibus-Modbus網關在控制系統中使支持Profibus協議的設備與支持Modbus RTU協議的設備之間進行通訊協議轉換的作用,使得支持不同通訊協議的設備之間能夠進行數據傳遞,并且給出了設計方法.應用Profibus-Modbus總線橋WL-ABD30…

開源是什么?我們為什么要開源?

本片為故事類文章推薦聽音頻哦 軟件自由運動的背景 夢開始的地方 20世紀70年代&#xff0c;軟件行業處于早期發展階段&#xff0c;軟件通常與硬件捆綁銷售&#xff0c;用戶對軟件的使用、修改和分發權利非常有限。隨著計算機技術的發展和互聯網的普及&#xff0c;越來越多的開…

Educational Codeforces Round 179 (Rated for Div. 2)(A-E)

題目鏈接&#xff1a;Dashboard - Educational Codeforces Round 179 (Rated for Div. 2) - Codeforces A. Energy Crystals 思路 貪心地模擬一下過程很容易就看出來了&#xff0c;每次變成盡可能大的數 1 1 0 -> 1 1 3 -> 3 3 5 -> 5 5 11....我們只需要關注最大…

React Native開發鴻蒙運動健康類應用的項目實踐記錄

??項目名稱??&#xff1a;HarmonyFitness - 基于React Native的鴻蒙運動健康應用 ??技術棧??&#xff1a;React Native 0.72.5 TypeScript HarmonyOS API ArkTS原生模塊 一、環境搭建與項目初始化 ??雙環境配置?? ??React Native環境??&#xff1a; npx re…

Linux --UDP套接字實現簡單的網絡聊天室

一、Server端的實現 1.1、服務端的初始化 ①、創建套接字&#xff1a; 創建套接字接口&#xff1a; #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int socket(int domain, int type, int protocol); //1. 這是一個創建套接字的接…

Eureka 高可用集群搭建實戰:服務注冊與發現的底層原理與避坑指南

引言&#xff1a;為什么 Eureka 依然是存量系統的核心&#xff1f; 盡管 Nacos 等新注冊中心崛起&#xff0c;但金融、電力等保守行業仍有大量系統運行在 Eureka 上。理解其高可用設計與自我保護機制&#xff0c;是保障分布式系統穩定的必修課。本文將手把手帶你搭建生產級 Eur…

Spring Boot應用開發實戰

Spring Boot應用開發實戰&#xff1a;從零到生產級項目的深度指南 在當今Java生態中&#xff0c;Spring Boot已占據絕對主導地位——據統計&#xff0c;超過75%的新Java項目選擇Spring Boot作為開發框架。本文將帶您從零開始&#xff0c;深入探索Spring Boot的核心精髓&#xf…

yum更換阿里云的鏡像源

步驟 1&#xff1a;備份原有源配置&#xff08;重要&#xff01;&#xff09; sudo mkdir /etc/yum.repos.d/backup sudo mv /etc/yum.repos.d/CentOS-* /etc/yum.repos.d/backup/步驟 2&#xff1a;下載阿里云源配置 sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https:…

【算法訓練營Day06】哈希表part2

文章目錄 四數相加贖金信三數之和四數之和 四數相加 題目鏈接&#xff1a;454. 四數相加 II 這個題注意它只需要給出次數&#xff0c;而不是元組。所以我們可以分治。將前兩個數組的加和情況使用map存儲起來&#xff0c;再將后兩個數組的加和情況使用map存儲起來&#xff0c;ke…

JS手寫代碼篇---手寫apply方法

11、手寫apply方法 apply方法的作用&#xff1a; apply 是一個函數的方法&#xff0c;它允許你調用一個函數&#xff0c;同時將函數的 this 值設置為指定的值&#xff0c;并將函數的參數作為數組&#xff08;或類數組對象&#xff09;傳遞給該函數。 與call的區別&#xff1…