淺聊一下HTTP協議

在日常上網瀏覽網頁、刷視頻時,背后都離不開 HTTP 協議的支持。作為 Web 世界的 “交通規則”,它負責服務器和客戶端瀏覽器之間的數據傳輸。這篇文章就帶大家全面了解 HTTP 協議,從基本概念到通信細節,再到安全相關的 HTTPS,讓你對它有清晰的認知。

一、HTTP 協議是什么?

HTTP 協議,全名叫 Hyper Text Transfer Protocol(超文本傳輸協議),是應用層里專門用來在服務器和客戶端瀏覽器之間傳輸超文本數據的協議。像我們平時看到的文字、圖片、視頻、音頻這些,都靠它來傳遞。

它不只是個簡單的傳輸協議,還是個雙向協議,工作在 “瀏覽器 - 服務器” 架構下。簡單說就是:瀏覽器把請求數據發給服務器,服務器處理完請求后,再把響應信息回傳給瀏覽器。

二、HTTP 協議怎么通信?

HTTP 屬于應用層協議,默認用 80 端口,在傳輸層會借助 TCP 協議來傳數據。整個通信過程分 11 步,咱們結合瀏覽器和服務器(比如 Tomcat)的交互來看看:

  1. 用戶在瀏覽器上發起新請求,比如輸入網址按回車;
  2. 瀏覽器向服務器發送 TCP 連接請求;
  3. 服務器和瀏覽器通過 TCP 三次握手,建立起 TCP 連接;
  4. 瀏覽器按照 HTTP 協議格式,生成請求數據包(也就是 HTTP 請求報文);
  5. 把這個請求數據包發給服務器;
  6. 服務器按照 HTTP 協議格式,解析收到的請求報文;
  7. 服務器執行請求處理,調用相關的業務邏輯方法,生成響應數據;
  8. 服務器再按照 HTTP 協議格式,把響應數據打包成響應數據包(HTTP 響應報文);
  9. 服務器把響應數據包發送給瀏覽器;
  10. 瀏覽器按照 HTTP 協議格式,解析響應數據包;
  11. 瀏覽器把響應數據包里的內容顯示在頁面上,用戶就能看到網頁了。

三、URL:定位資源的 “地址”

HTTP 協議靠 URL(Uniform Resource Locator,統一資源定位符)來找到要訪問的資源,它的格式是:http://host [":"port] [abs_path]

給大家舉個例子:http://192.168.0.116:8080/index.html,這里每個部分的意思很明確:

  • “http” 表示用 HTTP 協議定位網絡資源;
  • “host” 是合法的 Internet 主機域名或者 IP 地址,比如例子里的 “192.168.0.116”;
  • “port” 是端口號,要是沒寫就用默認的 80 端口,例子里用的是 8080 端口;
  • “abs_path” 是請求資源的 URI,例子里就是 “/index.html”。

這里得提一下 URL 和 URI、URN 的關系。URL 是 URI(Uniform Resource Identifier,統一資源標識符)的子集,它在 URI 的基礎上多了定位資源的能力。而 URI 除了包含 URL,還包含 URN(Uniform Resource Name,統一資源名稱)。URN 只用來定義資源的名稱,沒法定位資源,比如 “urn:isbn:0451450523”,這只是一本書的 ISBN 編號,能確定是哪本書,但沒法知道在哪兒能找到這本書。

簡單總結下三者的關系:URI 是大概念,下面分了 URL 和 URN,URL 能定位資源,URN 只能命名資源。

四、HTTP 報文:數據傳輸的 “包裹”

HTTP 報文分請求報文和響應報文,就像快遞包裹一樣,里面裝著通信需要的各種信息。

4.1 請求報文

瀏覽器通過 URL 發請求時,會把請求信息打包成 HTTP 請求報文發給服務器。它的結構分四部分:

  1. 第一行是請求行,包含請求方式、URL、協議版本,比如 “GET /index.html HTTP/1.1”;
  2. 接下來幾行是 HTTP 請求首部,里面有多個首部字段,用來傳遞額外的請求信息;
  3. 一個空行,作用是分隔首部和后面的內容主體 Body;
  4. 最后是請求的內容主體,也就是要傳給服務器的數據(不是所有請求都有)。

4.2 響應報文

服務器處理完請求后,會把響應信息裝進 HTTP 響應報文回傳給瀏覽器。它的結構和請求報文類似,也分四部分:

  1. 第一行是狀態行,包含協議版本、狀態碼和描述,最常見的就是 “HTTP/1.1 200 OK”,表示請求成功;
  2. 接下來幾行是響應首部,同樣有多個首部字段;
  3. 一個空行,分隔首部和內容主體;
  4. 最后是響應的內容主體,也就是服務器返回給瀏覽器的數據,比如網頁的 HTML 代碼。

給大家看個 HTTP 響應報文的示例(實際報文會更復雜,這里是簡化版):

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 1234<html>
<body>
響應內容
</body>
</html>

五、常用的 HTTP 請求方式

HTTP 請求報文的第一行(請求行)里會指定請求方式,常見的有 GET、POST、HEAD、PUT、DELETE、OPTIONS 這幾種,各自的用途不一樣:

請求方式用途特點
GET獲取資源只檢索數據,不影響資源;參數通過 URL 傳遞;冪等且可緩存
POST提交數據增加資源用來創建或增加資源;兩個相同請求不會覆蓋;參數通過 Request Body 傳遞;非冪等且不可緩存
HEAD獲取響應報頭和 GET 類似,但只返回響應報頭,沒有內容主體;常用于確認 URL 有效性和資源更新時間
PUT修改資源用來更新資源;兩個相同請求會覆蓋;數據通過內容主體傳遞;冪等
DELETE刪除資源用來刪除指定資源;冪等
OPTIONS查詢支持的方法詢問指定 URL 支持哪些請求方式;返回結果會包含 “Allow: GET, POST, HEAD, OPTIONS” 這類內容

這里重點說下 GET 和 POST 的區別,這倆是平時用得最多的:

  1. 用途不同:GET 是拿數據,POST 是提交數據;
  2. 請求報文格式有差異:POST 的請求行是 “POST /URL HTTP/1.1 \r\n”,GET 的是 “GET /URL HTTP/1.1 \r\n”;
  3. 參數傳遞方式不一樣:GET 的參數在 URL 里,POST 的參數在 Request Body 里;
  4. 冪等性和緩存不同:GET 是冪等(多次執行結果一樣)且能緩存,POST 是非冪等且不能緩存。

六、HTTP 首部字段:傳遞額外信息的 “小紙條”

HTTP 首部字段就像通信時附帶的 “小紙條”,用來傳遞額外的信息,比如服務器域名、數據長度、內容類型等等。下面給大家介紹幾個常用的:

  1. Host 字段:瀏覽器發請求時,用來指定服務器的域名。示例:Host: www.apesource.com
  2. Content-Length 字段:服務器返回響應時,告訴瀏覽器本次響應數據的長度。示例:Content-Length: 1000
  3. Connection 字段:瀏覽器用來要求服務器使用長連接,方便后續請求復用。示例:Connection: keep-alive(要是想斷開連接,就寫Connection: close
  4. Content-Type 字段:服務器告訴瀏覽器,本次響應數據的類型和編碼。示例:Content-Type: text/html; charset=utf-8(表示是 HTML 文件,編碼是 UTF-8)
  5. Accept 字段:瀏覽器發請求時,說明自己能接受哪些格式的響應數據。示例:Accept: */*(表示所有格式都能接受)
  6. Content-Encoding 字段:服務器告訴瀏覽器,響應數據用的壓縮格式。示例:Content-Encoding: gzip
  7. Accept-Encoding 字段:瀏覽器告訴服務器,自己能處理哪些壓縮格式。示例:Accept-Encoding: gzip, deflate

七、HTTP 狀態碼:請求結果的 “反饋信號”

服務器返回的響應報文里,狀態行中的狀態碼就像 “反饋信號”,告訴瀏覽器請求處理的結果。狀態碼分 5 大類,每類有不同的含義:

7.1 1XX:信息提示

這類狀態碼是協議處理中的中間狀態,實際用得很少,主要是告訴瀏覽器 “請求正在處理中”。

7.2 2XX:請求成功

表示服務器成功處理了請求,常見的有:

  • 200 OK:最常用的,說明請求完全成功,響應里有完整的內容主體;
  • 204 No Content:和 200 OK 類似,但響應報文沒有內容主體;
  • 206 Partial Content:用于分塊下載或斷點續傳,說明返回的只是資源的一部分。

7.3 3XX:重定向

表示客戶端請求的資源位置變了,需要用新的 URL 重新請求,常見的有:

  • 301 Moved Permanently:永久重定向,說明原來的資源沒了,以后都得用新 URL 訪問;
  • 302 Found:臨時重定向,資源還在,但暫時得用另一個 URL 訪問。

7.4 4XX:客戶端錯誤

表示瀏覽器發的請求有問題,服務器沒法處理,常見的有:

  • 400 Bad Request:請求報文格式錯了,服務器看不懂;
  • 403 Forbidden:服務器不讓訪問這個資源,不是請求格式的問題;
  • 404 Not Found:請求的資源在服務器上找不到;
  • 405 Not Allowed:服務器不支持瀏覽器用的這種請求方式。

7.5 5XX:服務器錯誤

表示請求沒問題,但服務器處理時出了內部錯誤,常見的有:

  • 500 Internal Server Error:服務器內部出了未知錯誤;
  • 501 Not Implemented:瀏覽器請求的功能,服務器還沒實現;
  • 502 Bad Gateway:服務器作為網關或代理時,訪問后端服務器出錯了(自身沒問題);
  • 503 Service Unavailable:服務器現在太忙了,暫時沒法響應請求,建議稍后再試。

八、連接管理:讓通信更高效

HTTP 的連接管理主要涉及短連接、長連接和管線化連接,目的是減少通信開銷,提高效率。

8.1 短連接和長連接

  • 短連接:HTTP/1.0 默認用的是短連接。每次通信都要重新 TCP 三次握手建立連接,響應完就 TCP 四次揮手斷開。這樣頻繁建立和斷開連接,開銷很大。
  • 長連接:HTTP/1.1 改成了默認長連接(也叫持久性連接)。建立一次 TCP 連接就能進行多次 HTTP 通信,不用每次都重新連,大大減少了開銷,還能減輕服務器壓力。

這里要注意兩點:

  1. HTTP/1.0 里要是想用長連接,得在請求里加Connection: Keep-Alive
  2. HTTP/1.1 里要是想斷開長連接,客戶端或服務器得發Connection: close

8.2 管線化連接

管線化連接是把多個 HTTP 請求批量提交的技術,發請求時不用等服務器先響應前一個。不過這得基于長連接,而且只有 HTTP/1.1 支持,HTTP/1.0 不支持。

比如以前發兩個請求,得等第一個請求的響應回來,再發第二個;有了管線化,能同時把兩個請求發出去,服務器處理完再依次返回響應,效率更高。

九、HTTPS:給 HTTP 加層 “安全鎖”

HTTP 協議因為用明文傳輸,存在不少安全問題,而 HTTPS 就是為了解決這些問題而生的。

9.1 HTTP 的安全隱患

HTTP 用明文傳數據,會有三個主要問題:

  1. 內容可能被竊聽:比如數據被抓包,里面的信息就能被看到;
  2. 通信方身份可能被偽裝:比如遇到釣魚網站,你以為是正規網站,其實是假的;
  3. 報文可能被篡改:比如傳輸過程中,數據被改了(像強制植入廣告),還沒法發現。

9.2 什么是 HTTPS?

HTTPS 不是新協議,而是在 HTTP 和 TCP 之間加了一層 SSL(Secure Sockets Layer,安全套接層)。簡單說就是:HTTP 先和 SSL 通信,再由 SSL 和 TCP 通信。通過 SSL,HTTPS 有了加密(防竊聽)、認證(防偽裝)、完整性保護(防篡改)這三個能力。

9.3 HTTP 和 HTTPS 的區別

  1. 安全性不同:HTTP 明文傳輸,不安全;HTTPS 加了 SSL,加密傳輸,安全;
  2. 連接建立過程不同:HTTP 只要 TCP 三次握手就能傳報文;HTTPS 在 TCP 三次握手后,還要進行 SSL 握手,才能傳加密報文;
  3. 端口不同:HTTP 默認 80 端口,HTTPS 默認 443 端口;
  4. 證書要求不同:HTTPS 需要向 CA(證書權威機構)申請數字證書,證明服務器身份;HTTP 不用。

9.4 兩種加密方式

HTTPS 的加密主要用兩種方式,各有優缺點:

9.4.1 對稱密鑰加密

加密和解密用同一個密鑰。優點是運算速度快,缺點是沒法安全地把密鑰傳給對方 —— 要是密鑰在傳輸過程中被偷了,加密就沒意義了。

9.4.2 非對稱密鑰加密

也叫公開密鑰加密,加密和解密用不同的密鑰(一個公鑰,一個私鑰)。公鑰誰都能拿,私鑰只有自己有。

  • 加密過程:發送方用接收方的公鑰加密數據,接收方用自己的私鑰解密;
  • 簽名過程:發送方用自己的私鑰簽名,接收方用發送方的公鑰驗證簽名,能確認發送方身份。

優點是公鑰傳輸安全,缺點是運算速度慢。

9.5 HTTPS 的工作原理

HTTPS 的工作過程其實就是結合了兩種加密方式,既保證安全又兼顧速度,具體步驟如下:

  1. 用戶用瀏覽器訪問 HTTPS 網站,服務器收到請求后,選擇瀏覽器支持的加密和哈希算法,然后把數字證書(里面包含頒發機構、網址、公鑰、有效期等信息)返回給瀏覽器;
  2. 瀏覽器校驗證書:要是證書有問題(比如過期、不被信任),會彈出警告;要是沒問題,就生成一個隨機秘鑰 X,用證書里的公鑰加密后發給服務器;
  3. 服務器收到加密后的隨機秘鑰 X,用自己的私鑰解密,得到 X;然后用 X 對網頁內容加密,發給瀏覽器;
  4. 瀏覽器用之前生成的隨機秘鑰 X 和約定的加密算法,解密服務器發來的內容,最后把網頁顯示給用戶。

到這里,HTTP 協議的核心內容就講完了。從基本概念到通信流程,再到安全升級的 HTTPS,相信大家對 HTTP 有了更全面的認識。如果有疑問,歡迎在評論區交流~

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

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

相關文章

機器人控制器開發(定位——cartographer ros2 使用2)

文章總覽 1 純定位模式 當完成建圖后&#xff0c;會生成pbstream格式的地圖文件 配置純定位模式的lua腳本 backpack_2d_localization.lua include "backpack_2d.lua"TRAJECTORY_BUILDER.pure_localization_trimmer {max_submaps_to_keep 3, } POSE_GRAPH.optimi…

《大數據之路1》筆記3:數據管理

一 元數據 1.1 元數據概述 定義&#xff1a; 元數據是關于數據的數據&#xff0c;元數據打通了源數據、數據倉庫、數據應用&#xff0c;記錄了數據從生產到消費的全部過程。元數據主要記錄數據倉庫中模型的定義、各層級間的映射關系、監控數據倉庫的數據狀態和ETL的任務運行狀態…

排序實現java

排序算法概述Java中實現排序可以通過多種方式&#xff0c;包括內置方法、自定義算法或使用第三方庫。常見的排序算法有冒泡排序、選擇排序、插入排序、快速排序、歸并排序等。使用Arrays.sort()方法對于數組排序&#xff0c;Java提供了Arrays.sort()方法&#xff0c;支持對基本…

51c大模型~合集182

我自己的原文哦~ https://blog.51cto.com/whaosoft/14174587 #LaV-CoT 超越GPT-4o&#xff0c;螞蟻集團與南洋理工大學提出&#xff1a;首個語言感知的視覺思維鏈 隨著大型視覺語言模型&#xff08;VLM&#xff09;的飛速發展&#xff0c;它們在處理復雜的視…

C++ STL之deque的使用和模擬實現

目錄 deque 核心本質與定位 與stack和queue的關系: deque的使用 deque的底層實現 deque的原理介紹 deque的缺陷 總結: deque deque文檔 : deque 翻譯: 雙端隊列 deque&#xff08;通常發音類似“deck”&#xff09;是“double-ended queue”&#xff08;雙端隊列&…

布草洗滌廠設備租賃押金原路退回系統—東方仙盟

設備租賃狀態設備管理添加設備設備收押金設備退押金在布草洗滌行業的運營版圖中&#xff0c;設備租賃是連接廠商與客戶的重要紐帶&#xff0c;而押金的收取與退還則是這一環節中關乎信任與效率的關鍵節點。未來之窗布草洗滌廠深諳此道&#xff0c;專為設備租賃業務打造的 “押金…

換源rocklinux和centos

一、Rockylinux換源&#xff0c;國外的源換成國內的源#nmcli connection modify ens33 ipv4.addresses 192.168.121.11 ipv4.gateway 192.168.121.2 ipv4.method manual ipv4.dns 114.114.114.114 connection.autoconnect yes修改地址#systemctl stop firewalld#systemctl diab…

第一部分:服務器硬件配置

目錄1.1 服務器上架與連線1.2 啟用CPU虛擬化功能&#xff08;BIOS設置&#xff09;1.3 配置RAID存儲步驟1&#xff1a;進入RAID配置界面步驟2&#xff1a;確認RAID控制器信息步驟3&#xff1a;創建系統RAID&#xff08;用于安裝ESXi&#xff09;步驟4&#xff1a;創建數據RAID&…

手搓一個 DELL EMC Unity存儲系統健康檢查清單

寫在前面對于DELL EMC存儲系統Unity的一些深度的健康檢查通過Web的Unisphere圖形化界面是做不到的&#xff0c;圖形化界面只能看到是否有告警&#xff0c;物理的東西是否有問題的&#xff0c;邏輯的Pool和LUN等是否ready&#xff0c;再深入的潛在的問題是查不到的。另外&#x…

【數據結構】二叉樹的概念

01 概念定義&#xff1a;二叉樹既然叫二叉樹&#xff0c;顧名思義即度最大為2的樹稱為二叉樹。 它的度可以為 1 也可以為 0&#xff0c;但是度最大為 2 。 一顆二叉樹是節點的一個有限集合&#xff0c;該集合&#xff1a;① 由一個根節點加上兩棵被稱為左子樹和右子樹的二叉樹組…

【RK3576】【Android14】如何在Android14下單獨編譯kernel-6.1?

單獨編譯kernel依賴如下幾個源碼&#xff1a;【交叉編譯工具鏈】prebuilts/clang/host/linux-x86/clang-r487747c【內核源碼】kernel-6.1為什么Android下編譯內核使用clang作為交叉編譯工具鏈而不是GCC&#xff1f;Android 14 選擇使用預置的 Clang 工具鏈&#xff08;如 clang…

什么是Redis的Pipeline

介紹Redis的Pipeline是一種網絡優化技術&#xff0c;在沒有Pipeline的時候&#xff0c;客戶端往redis發送請求&#xff0c;客戶端需要等到redis響應之后才能發送下一個請求。而Pipeline&#xff0c;使redis可以一次性接收多個請求。減少了通信次數&#xff0c;顯著的提高了性能…

【ElementUI el-table跨頁勾選】

一、el-table需加上refs和 row-key屬性 二、type"selection"勾選框 需加上 reserve-selection儲備選擇屬性 三、在分頁請求數據時&#xff0c;觸發 setSelected()方法 四、在 selection-change變化時保存 selectedRows <el-table ref"tables" :data&quo…

論文閱讀/博弈論/拍賣:《Truthful Auction for Cooperative Communications》

摘要&#xff1a;一方面&#xff0c;協作通信由于其在提升無線網絡容量方面的巨大潛力而日益受到關注。另一方面&#xff0c;協作通信技術的實際應用卻很少見&#xff0c;即使在一些對帶寬需求極高的應用場景中&#xff0c;系統設計者也并未采用協作通信技術來開發創新的網絡解…

系統軟中間件:連接軟件與硬件的橋梁

理解“系統軟中間件”這個術語很重要&#xff0c;它實際上是兩個緊密相關但又不同的概念的組合&#xff1a; 系統軟件中間件 嚴格來說&#xff0c;“系統軟中間件”不是一個標準的獨立術語。它通常指的是屬于系統軟件范疇的中間件&#xff0c;或者理解為作為系統軟件重要組成部…

音視頻學習(六十四):avc1 hvc1和hev1

基礎概念縮寫編碼標準FourCC說明AVC/H.264Advanced Video Codingavc1最常用的 H.264 編碼標識符&#xff0c;兼容 MP4/MOV/FMP4 等容器。HEVC/H.265High Efficiency Video Codinghvc1HEVC 視頻流在 MP4/FMP4 中常用標識符&#xff0c;要求存儲 NALU 的 VPS/SPS/PPS&#xff08;…

【WIT】編程百問一

01 什么時postman&#xff1f; Postman 是一款專門用于幫助開發人員處理 API 的工具&#xff0c;它的作用主要有以下幾個方面&#xff1a; 方便調試 API&#xff1a;就像你打電話給別人要先撥對號碼一樣&#xff0c;開發人員要讓不同的軟件系統之間通過 API 進行通信&#xff…

RAG 從入門到放棄?丐版 demo 實戰筆記(go+python)

背景 我當前有一個業務系統&#xff0c;希望能添加一個機器人助手。直接使用大模型&#xff0c;由于缺少相關的業務數據&#xff0c;效果并不理想&#xff0c;了解一下 RAG。 什么是 RAG RAG(Retrieval Augmented Generation)&#xff0c;搜索引擎 大模型。 簡單來說就是從…

《IDEA 突然“三無”?三秒找回消失的綠色啟動鍵、主菜單和項目樹!》

目錄 一、左上角綠色啟動鍵憑空消失 1.1 解決辦法 二、頂部 File / Edit / View... 整條主菜單欄 罷工 2.1 解決辦法 三、左側 Project 工具窗口 集體失聯&#xff0c;只剩 External Libraries 孤零零 3.1 解決辦法 昨天下午擼代碼&#xff0c;不知道按到了哪兒&#xff…

軟件工程實踐二:Spring Boot 知識回顧

文章目錄一、創建項目&#xff08;Spring Boot 向導&#xff09;二、項目最小代碼示例三、運行與驗證四、標準目錄結構與說明五、Maven 依賴最小示例&#xff08;僅供參考&#xff09;六、常用配置&#xff08;application.yml 示例&#xff09;七、返回 JSON 與統一異常八、Va…