HTTP基本結構

目錄

  • 前言
  • 1. 概念
  • 2. HTTP基本格式
    • 2.1 抓包原理
    • 2.2 抓包軟件使用
    • 2.3 抓包結果
  • 3. HTTP請求
    • 3.1 URL
    • 3.2 方法
    • 3.3 版本號
    • 3.4 HTTP報頭
    • 3.4 正文部分
  • 4. HTTP響應
    • 4.1 HTTP狀態碼
    • 4.2 其他部分
  • 總結

前言

本篇文章介紹HTTP的基本結構。

1. 概念

HTTP全稱為超文本傳輸協議,是一種應用非常廣泛的應用層協議。誕生于1991年,目前已經發展為最主流使用的應用層協議。超文本的意思是,文本中包含了更復雜的內容(例如圖片、視頻、音頻、特殊字體、鏈接等)。

2. HTTP基本格式

HTTP是一種文本格式的協議,我們需要使用抓包軟件來觀察HTTP的協議格式。這里使用fiddler進行抓包。

2.1 抓包原理

抓包軟件本質上是一個“代理程序”這里以fiddler為例,在瀏覽器訪問界面時,就會把HTTP請求先發給Fiddler,Fiddler再把請求轉發給對應的服務器,服務器返回數據時,Fiddler拿到返回數據,再把數據交給瀏覽器,所以Fiddler對于瀏覽器和服務器的交互細節是非常清楚的,所以抓包軟件就可以監聽網卡上通過的數據了。

2.2 抓包軟件使用

以fiddler為例,在這個地址進行安裝: fiddler安裝。
在這里插入圖片描述
左側窗口顯示了所有的HTTP請求/響應,可以選中某個請求來觀看詳細內容,右側上方顯示HTTP請求的報文內容,右下方顯示了HTTP響應的報文內容。點擊Raw可以看到詳細的數據格式。

2.3 抓包結果

請求基本格式:
在這里插入圖片描述

  1. 首行:請求中的第一行我們稱為首行。
  2. 請求頭:第二行開始往后若干行我們稱為請求頭。
  3. 空行:空行為請求頭的結束標記
  4. 正文:空行之后的內容(這里的請求沒有)

響應基本格式:
在這里插入圖片描述

  1. 首行:請求中的第一行我們稱為首行。
  2. 響應頭:第二行后的若干行。
  3. 空行:空行為請求頭的結束標記。
  4. 正文:空行之后的內容
    這里的正文可以看到是二進制內容,這是把文本壓縮成二進制了,用來節省資源。
    解壓縮后:
    在這里插入圖片描述
    可以看到,正文部分包含了網頁的HTML。

3. HTTP請求

先看請求的首行:
GET https://www.csdn.net/ HTTP/1.1
這里分成了三個部分,GET稱為方法,HTTP/1.1這個部分稱為版本號,中間這個部分我們稱為URL。我們著重講這三個部分。

3.1 URL

URL全稱”唯一資源定位符“,描述了網絡上某個資源的具體位置。互聯網每個文件都有唯一的URL,它包含的信息指出了文件的位置以及瀏覽器對其的處理方式。
URL的完整結構:
在這里插入圖片描述
協議方案名:常見的由http和https。
登錄信息:這里登錄信息(認證)的內容已經淘汰,現在已經沒有網站采取URL進行認證了。
服務器地址:是IP地址,一般填的是域名,會通過DNS系統解析成一個具體的IP地址。
端口號:如果省略,會根據協議自動決定使用哪個端口。
帶層次的文件路徑:一個機器上的一個服務器程序可能管理者很多資源,可能是真實的文件,也可能是一些動態生成的資源(根據請求計算出來的響應)。
查詢字符串:是鍵值對(query string)的格式,通過‘=”分割鍵和值。通過“&”分割多個鍵值對,這里鍵值對的含義由程序員來自定義。通過查詢字符就可以讓客戶端給服務器傳遞一些參數。
片段標識符:標識網頁的某個部分,實現“頁面內跳轉”功能,在一些文檔類網站,會帶有這個。

URL一些部分可以省略:
協議名:可以省略,省略后默認為http://
ip地址/域名:在HTML中可以省略。省略后標識服務器的ip/域名與當前HTML所屬的ip/域名一致。
端口號:可以省略。省略后如果是http協議,自動設為80;如果是https協議,自動設置為443
帶層次的文件路徑:可以省略。省略后相當于/。一些服務器在發現“/”路徑的時候自動訪問/index.html。
查詢字符串和片段標識也都可以省略。

關于URL encode
url的query string中的value部分可能需要進行轉義。規則是把特殊符號的 ascii碼取出來,按照字節維度插入一些“%”。
中文也需要轉義,這是因為中文通過uft8/gbk之類的編碼格式表示,可能某個漢字的utf8/gbk編碼中的某個字節,恰好和某個特殊符號的ascii碼相同了。
query string的內容,程序員可以自定義(尤其是value),如果value中包含特殊符號,就可能使url的解析出現錯誤。這是因為url中的特殊符號有特定含義。

3.2 方法

在這里插入圖片描述
HTTP方法表達的是一種語義,介紹上圖幾個常用的:

  1. GET:從服務器獲取某個資源。
    GET方法是HTTP中最常見的方法,很多操作都會觸發HTTP的GET請求:
    直接在瀏覽器輸入url;
    頁面上點擊一些跳轉鏈接;
    HTML間接加載其他資源的時候(CSS,JS,圖片等 );
    通過js/java/C++/Python等代碼手動構造GET請求。
    GET請求特點:
    GET請求一般沒有body;
    GET請求要給服務器傳遞數據,往往是通過路徑/query string來進行傳遞。
  2. POST:向服務器上傳一些資源。
    登錄時或者上傳資源/文件時會觸發。登陸時提交填寫的用戶和密碼。上傳資源/文件時提交傳輸資源的內容。
    POST帶有body,通過body給服務器傳遞數據,通常下不使用query string傳遞數據。
  3. PUT:向服務器上傳某個資源(文件)。和POST差不多一樣。
  4. DELETE:刪除服務器的某個資源。和GET類似,也是一般不帶有body,通過quert string傳遞參數。

3.3 版本號

HTTP1.1是目前最主流的HTTP版本號。與請求不同的是,響應的版本號在首行的前面。

3.4 HTTP報頭

在這里插入圖片描述
報頭的形式是行文本,每一行是一個鍵值對,鍵和值之間用 “ :加一個空格"(: ) 來分割。
介紹簡單一下header的一些key:

  1. Host:描述了訪問的服務器的IP(域名)和端口 (可以省略)
  2. Content-Length和Content-Type:前一個描述了body的長度,后一個描述了body的數據格式,所以在請求/響應中包含body時才會有這兩個key。Contet-Length這一個key解決了“粘包問題”。如果一個請求/響應,有body但沒有這其中一個key,那么這就是一個非法的“請求/響應”。
  3. User-Agent:表示瀏覽器/操作系統的屬性。
  4. Referer:表示這個界面是從哪個界面跳轉過來的。內容是一個網址。
  5. Cookie:Cookie中的內容是鍵值對,使用分號(;)來分割多個鍵值對,使用等號(=)來分割鍵和值。Cookie本質是瀏覽器在本地存儲數據的一種機制。此外,瀏覽器本地存儲cookie時,按照域名維度進行管理。
    瀏覽器為了把控安全,瀏覽器會限制一個網站的權限,比如會禁止網站訪問硬盤,禁止網站調用電腦上的其他應用程序。所以網站如果在電腦上存儲一些數據,就需要用到Cookie,其中的內容是服務器返回給瀏覽器的,瀏覽器會把Cookie保存到本地,由于不允許網站隨意訪問硬盤,所以只能按照“鍵值對”形式來存儲簡單數據。
    在服務器響應header中可能會包含set-cookie這樣的報頭,每一個set-cookie就對應一個cookie鍵值對。
    Cookie鍵值對是自定義的,我們可以通過Cookie保存一些沒那么重要但是有用的信息,如“上次訪問時間”。

3.4 正文部分

請求的body部分,簡單介紹一下一些常見的數據格式,有application/json,text/html,text/css,application/JavaScript,image/png。

4. HTTP響應

4.1 HTTP狀態碼

在響應的首行就是HTTP的狀態碼。
在這里插入圖片描述
不同的狀態碼表示不同的含義,在官方文檔中有很多狀態碼,下面介紹幾種常用的:

  1. 200 OK:表示訪問成功,這里的成功表示HTTP層的成功,不代表業務層面的成功,比如注冊賬號,提交用戶名,由于用戶名重復,導致注冊失敗,這就是業務失敗,但也可以通過200這樣的狀態碼表示。
  2. 404 Not Found:客戶端要訪問的資源不存在,即URL中層次結構的路徑不存在。
  3. 403 Forbidden:訪問被拒絕(沒有權限訪問)
  4. 500 Internal Server Error:服務器拋出異常,崩潰了
  5. 504 Gateway TimeOut:服務器負載大,處理請求超時。
  6. 302 Move temporarily:臨時重定向,跳轉到另一個界面,例如登錄頁面登錄成功后自動跳轉到主頁。響應報文header部分會包含一個Location字段,表示要跳轉到哪個界面。
  7. 301 Moved Permanently:永久重定向,瀏覽器收到這種響應時,后續的請求都會被自動改成新的地址。

4.2 其他部分

響應報頭響應正文和上面請求對應的部分差不多,不再講述。

總結

本篇文章較為詳細的介紹了HTTP的基本結構,同時還順帶介紹了fiddle抓包工具,看完這篇文章后,希望你能對HTTP能夠有較為深入的理解。

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

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

相關文章

CVPR優秀論文 | DashGaussian:在200秒內優化三維高斯點繪制

本文選自gongzhonghao【圖靈學術SCI論文輔導】關注我們,掌握更多頂會頂刊發文資訊1.導讀1.1 論文基本信息論文標題:DashGaussian: Optimizing 3D Gaussian Splatting in 200 Seconds作者:Youyu Chen、Junjun Jiang、Kui Jiang、Xiao Tang、Zh…

知識蒸餾 - 基于KL散度的知識蒸餾 HelloWorld 示例 采用PyTorch 內置函數F.kl_div的實現方式

知識蒸餾 - 基于KL散度的知識蒸餾 HelloWorld 示例 采用PyTorch 內置函數F.kl_div的實現方式 flyfish kl_div 是 Kullback-Leibler Divergence的英文縮寫。 其中,KL 對應提出該概念的兩位學者(Kullback 和 Leibler)的姓氏首字母“div”是 div…

C語言基礎_補充知識、數據類型轉換、選擇結構

0、補充知識: 原碼、反碼、補碼的知識: 計算機中原碼轉補碼,正數不變,負數是符號位不變,其余各位取反碼加一。負數的補碼轉原碼應該是補碼減一然后再取反,為什么負數的補碼轉原碼是補碼取反然后再加一&…

ubuntu自動重啟BUG排查指南

當 Ubuntu 系統意外重啟時,排查原因需要從系統日志、硬件狀態和定時任務等多個方面入手。 示例:通過日志檢查重啟原因 last -x | head | tac 此命令顯示最近的關機和重啟記錄。如果記錄中包含 shutdown 或 crash,則可能是人為操作或系統故障導…

2. JS 有哪些數據類型

總結 基礎類型(7 種):number, string, boolean, null, undefined, symbol, bigint引用類型(對象及其子類):object, array, function, date, regexp, map, set 等 判斷方式推薦: 基礎類型&#x…

pipeline方法關系抽取--課堂筆記

Pipeline方法課堂筆記 一、Pipeline方法原理 pipeline方法是指在實體識別已經完成的基礎上再進行實體之間關系的抽取. pipeline方法流程: 先對輸入的句子進行實體抽取,將識別出的實體分別組合;然后再進行關系分類. 注意:這兩個子過…

linux系統離線環境安裝clickhouse客戶端

1、下載離線安裝包: 方式1:網站直接下載 鏈接:https://packagecloud.io/altinity/clickhouse 注意要下載同一版本的四個包 方式2:夸克網盤分享 鏈接:https://pan.quark.cn/s/7e77e6a1bc5f 2、將本地下載的安裝包上傳…

GPT-5的誕生之痛:AI帝國的現實危機

目錄 前言 一、“俄里翁”的隕落:一場夢碎的代際飛躍 二、扎克伯格的“抄家式”突襲 三、天才的詛咒:當AI聰明到無法與我們對話 四、燒錢的無底洞與微軟的影子 結語:AI帝國的黃昏,還是黎明前的黑暗? &#x1f3a…

探索設計模式的寶庫:Java-Design-Patterns

在軟件開發領域,設計模式是解決常見問題的經典方案,它們如同建筑師的藍圖,為開發者提供了經過驗證的最佳實踐。今天我要向大家介紹一個GitHub上的明星項目——java-design-patterns,這是一個全面、實用且持續更新的設計模式寶藏項…

JavaScript中的作用域、閉包、定時器 由淺入深

1. JavaScript中的作用域是什么? 作用域(Scope)是程序中定義變量的區域,它決定了變量的可訪問性(可見性)。在JavaScript中,作用域主要分為三種:全局作用域、函數作用域和塊級作用域&…

倉庫管理系統-11-前端之頭部區域Header的用戶登錄和退出功能

文章目錄 1 登錄功能 1.1 登錄頁面(Login.vue) 1.1.1 頁面布局 1.1.2 初始化數據 1.1.3 confirm方法 1.1.4 UserController.java(登錄接口) 1.1.5 Login.vue 1.2 登錄頁面的路由 1.2.1 創建路由文件(router/index.js) 1.2.2 注冊路由器(main.js) 1.2.3 路由視圖(App.vue) 2 退出…

【VLNs篇】07:NavRL—在動態環境中學習安全飛行

項目內容論文標題NavRL: 在動態環境中學習安全飛行 (NavRL: Learning Safe Flight in Dynamic Environments)核心問題解決無人機在包含靜態和動態障礙物的復雜環境中進行安全、高效自主導航的挑戰,克服傳統方法和現有強化學習方法的局限性。核心算法基于近端策略優化…

飛算科技:以自主創新引領數字科技浪潮,飛算JavaAI賦能產業智能化升級

技術創新已成為企業突破瓶頸、實現跨越式發展的核心驅動力。作為國家級高新技術企業,飛算數智科技(深圳)有限公司(簡稱“飛算科技”)憑借其深厚的互聯網科技、大數據與人工智能技術積淀,以及在民生產業、中…

51單片機按鍵復位電路電壓隨著電容放電升高的分析

一、引言在單片機系統中,復位電路是一個至關重要的組成部分,它確保了單片機在特定情況下能夠恢復到初始狀態,從而避免程序運行錯誤或系統崩潰。對于51單片機而言,按鍵復位電路是一種常用的復位方式,它通過手動按下復位…

JVM學習日記(十五)Day15——性能監控與調優(二)

好了我們這一篇繼續來說命令行監控指令,上一篇說了4個比較重要的指令,其中用的比較多的也就是jstat和jmap了。 jhat:堆轉儲分析工具 他是JDK自帶的分析工具,分析我們上一篇說的jmap轉存的內存快照,??內置了一個微型…

Docker國內鏡像列表

Docker 鏡像源列表(8月3日更新-長期&免費)_docker國內鏡像源-CSDN博客

Orange AI 管理平臺單體版安裝教程(Docker Compose 部署)

Orange AI 管理平臺單體版安裝教程(Docker Compose 部署) 本文介紹如何通過 Docker Compose 快速安裝 Orange AI 管理平臺單體版,適用于本地開發和測試環境。步驟簡單,適合初學者和有一定運維經驗的用戶。 一、環境準備 已安裝 …

PHP的魔術方法

一、介紹 ?PHP魔術方法是以雙下劃線__開頭的一組特殊方法,用于在對象生命周期、屬性訪問、方法調用等場景中實現自動化操作。?簡化面向對象編程。 二、17個現有的魔術方法 (一)、對象生命周期相關 1、__construct() 類的構造函數方法&a…

vue2實現類似chatgpt和deepseek的AI對話流打字機效果,實現多模型同時對話

實現多模型同時對話功能特點:1、抽離對話框成單獨組件ChatBox.vue,在新增模型對比窗口時可重復利用2、通過sse與后臺實時數據流,通過定時器實現打字效果3、適應深度思考內容輸出,可點擊展開與閉合4、可配置模型參數,本…

電腦上不了網怎么辦?【圖文詳解】wifi有網絡但是電腦連不上網?網絡設置

一、問題背景 你有沒有遇到過這種情況:電腦右下角的網絡圖標明明顯示連接正常,可打開瀏覽器就是加載不出網頁,聊天軟件也刷不出新消息? 這種 "網絡已連接但無法上網" 的問題特別常見,既不是沒插網線&#xf…