「網絡通信」HTTP 協議

HTTP

  • 🍉簡介
  • 🍉抓包工具
  • 🍉報文結構
    • 🍌請求
    • 🍌響應
    • 🍌URL
      • 🥝URL encode
    • 🍌方法
    • 🍌報文字段
      • 🥝Host
      • 🥝Content-Length & Content-Type
      • 🥝User-Agent(UA)
      • 🥝Referer
      • 🥝Cookie
  • 🍉狀態碼
    • 🍌類別
    • 🍌常見狀態碼

🍉簡介

HTTP 協議全稱為超文本傳輸協議,超文本比文本更加強大,它不僅包含字符串,還可以攜帶一些圖片、特殊格式等
HTTP 最主要的應用場景就是網站。瀏覽器和服務器、客戶端和服務器之間傳輸數據的協議,很可能就是 HTTP

在這里插入圖片描述


🍉抓包工具

抓包工具本質上是一個代理程序,能夠獲取到網絡上傳輸的數據并顯示出來,從而給程序員提供一些參考,在后面介紹 HTTP 報文格式的過程中,會頻繁用到抓包工具,這里我們使用 fiddler,它專注于 HTTP 的抓包

打開一個網站,瀏覽器和服務器之間會進行多次 HTTP 交互,其中第一次交互拿到的是這個頁面的 html

在這里插入圖片描述

選中這個請求并雙擊,可以看到明細:

在這里插入圖片描述
點擊 RAW,可以查看 HTTP 請求的原始數據
下面是請求的原始數據

在這里插入圖片描述

再來看下響應的原始數據

在這里插入圖片描述
為了節省帶寬,一般響應數據會被壓縮,對上述響應解壓縮得到:

在這里插入圖片描述


🍉報文結構

🍌請求

HTTP 請求包含 4 個部分

  1. 首行

在這里插入圖片描述

  1. 請求頭:由若干個鍵值對組成,每個鍵值對占一行,鍵和值之間使用 : 分割
  2. 空行:請求頭的結束標記
  3. 正文(body):http 的載荷部分,有的 http 請求有 body,有的沒有

在這里插入圖片描述

🍌響應

HTTP 響應的基本格式也是分為四個部分

  1. 首行

在這里插入圖片描述
2. 響應頭:這里是按照鍵值對的形式來組織內容
3. 空行
4. 響應正文(body):響應的載荷是 html

在這里插入圖片描述


🍌URL

URL 全稱為唯一資源定位符,用來描述一個網絡上資源的位置
一個 URL 的完整結構如下:

在這里插入圖片描述

🥝URL encode

query string(查詢字符串)里是自定義的鍵值對,而在 URL 中,有些特殊符號,比如 / : ? @ 等都是有特定的含義,如果 query string 中也包含同樣的符號,可能會使服務器 / 瀏覽器解析失敗,比較靠譜的方法就是對上述符號進行轉義(就像 C語言中用 printf 打印一些特殊符號一樣,需要轉義)。
除了這些特殊符號,漢字也要進行轉義,因為漢字的 utf8 / gbk 等編碼值中可能某個字節恰好和某個符號的 ASCII 碼值一致
下面舉個例子,比如搜索 C++:

在這里插入圖片描述


🍌方法

在這里插入圖片描述
有兩個典型的使用 POST 的場景:登錄和上傳
以登錄為例,在一個網站輸入賬號密碼登錄后抓包得到的數據報的 body:

在這里插入圖片描述

這里有一個比較經典的面試題:

GET 和 POST 有什么區別

GET 和 POST 本質上沒有區別。使用 GET 的場景也可以替換為 POST;使用 POST 的場景也可以替換為 GET。這取決于代碼是怎么寫的,尤其是服務器和客戶端都是自己實現的情況下
但是這兩者在使用習慣上還是有區別的:

  1. GET 習慣于把數據放到 URL 的 query string 中;POST 習慣于把數據放到 body 中
  2. 語義上的區別。標準文檔中,GET 的語義是用來獲取數據;POST 的語義是給服務器傳輸數據。當然實際使用并不拘泥于上述要求
  3. 關于冪等性。標準文檔中建議 GET 請求實現成冪等的;POST 則沒有要求。當然 GET 在實際開發中也不一定得實現成冪等
    這里的“冪等”源于數學術語,如果每次輸入的內容一定,輸出的結果也一定,那就是冪等;反之,若輸入內容一定,但輸出不一定,則不是冪等。在計算機中,如果某個操作是冪等的,那就可以進行緩存

🍌報文字段

🥝Host

表示服務器主機的地址和端口
在這里插入圖片描述


🥝Content-Length & Content-Type

這兩個字段分別表示 body 中數據的長度和請求的 body 中的數據格式
HTTP 底層也是基于 TCP。連續傳輸多個 HTTP 數據報的話,接收方這邊的接收緩沖區里就會積累多個包的數據,應用程序在讀取這些數據時需要明確包與包之間的邊界。通過長度可以解決粘包問題


🥝User-Agent(UA)

UA 描述了操作系統和瀏覽器的信息,這兩個其實就是在描述用戶使用什么樣的設備上網

在這里插入圖片描述
它里面包含了系統信息,這就可以判定系統是 PC 的系統,還是移動端的系統,此時可以根據這個信息來返回不同的頁面
比如在手機瀏覽器的設置中手動把 UA 修改為 PC 的 UA,那么就可以訪問電腦版的網頁了


🥝Referer

描述當前這個頁面從哪兒來,類似上層目錄,所以直接在瀏覽器輸入 URL 的路徑或從收藏夾中打開的網頁都是沒有 referer 的


🥝Cookie

Cookie 是報頭中一個非常重要的屬性,它本質上是瀏覽器本地持久化存儲數據的機制
操作系統提供了 api 操作文件,瀏覽器作為電腦上的一個程序,可以調用這些 api 來讀寫本地磁盤文件。而瀏覽器上運行的網頁,理論上也是可以通過瀏覽器提供的 api 來讀寫本地文件,但是為了保證安全性,瀏覽器禁止這種做法,也就是說它沒有給網頁提供這樣的 api。不然有些不法分子搞一些惡意網站,你點進去之后它就會把你電腦上的文件刪掉,這樣勢必會造成巨大損失!
不過有些網站需要把一些信息保存到瀏覽器這邊,比如登錄界面需要保存用戶的身份信息。所以瀏覽器給網頁提供了這樣的 api:可以有限度地存儲數據,但不能隨意訪問文件系統

Cookie 就是一種經典的存儲數據的機制,它將存儲的數據按照鍵值對的形式存儲起來,其中鍵值對是由程序員自定義的,和 query string 差不多,因此不同網站的 Cookie 都是不一樣的

在這里插入圖片描述

HTTP 請求中的 Cookie 字段就是把本地存儲的 Cookie 信息發送到服務器。相應地,HTTP 響應中會有一個 Set-Cookie 字段,這個是服務器告訴瀏覽器要在本地保存哪些信息
通常在首次訪問 / 登錄成功之后服務器會把數據返回給瀏覽器,然后 Cookie 會以域名為維度存儲在瀏覽器本地主機的硬盤上,比如瀏覽器訪問 Gitee,就有一組 Cookie,訪問 B 站,又有一組 Cookie,這些 Cookie 之間互不沖突,后續每次訪問服務器都會帶上對應網站的 Cookie
不同的客戶端保存的 Cookie 是不同的,即使是同一臺主機,使用不同的瀏覽器,Cookie 大概率也是不同的

在這里插入圖片描述
在這里插入圖片描述
Cookie 用途就是在客戶端保存數據,其中保存的數據最主要是用戶的身份標識,這樣服務器就可以通過標識來區分用戶。它一般不會保存其他業務數據,這些數據存在服務器,通過 Cookie 中的身份標識可以找到這些數據

有個典型的場景:在某個頁面登錄之后,下次登錄就不用再輸入賬號密碼,因為首次輸入賬密后這些信息就會保存在磁盤,下次進入網頁時就會先從本地讀取磁盤拿到賬密。發送 HTTP 請求后服務器收到 Cookie 中的用戶信息后就通過身份驗證了,所以不用再手動輸入賬密

補充:頁游中的賬號密碼等信息一般不是放在 Cookie 中的,因為瀏覽器保存的密碼都是明文密碼,放到 Cookie 中不安全


🍉狀態碼

🍌類別

在這里插入圖片描述

🍌常見狀態碼

  1. 200 OK
    打開 Fiddler,放眼望去基本都是 200,它表示請求已經成功處理
    在這里插入圖片描述
  2. 404 Not Found
    這個也很常見,Not found 表示訪問的資源沒找到,此處的資源指的是 URL 中的路徑
    比如輸入一個不存在的網址:

在這里插入圖片描述

  1. 403 Forbidden
    表示請求的資源沒有權限訪問

  2. 405 Method Not Allowed
    如果你的服務器只支持 GET 請求,但是你發了一個 POST 請求,那就會出現這個狀態碼

  3. 500 Internal Server Error
    表示服務器內部錯誤,遇到這種情況可能是服務器掛了

  4. 504 Gateway Timeout
    訪問服務器超時了,這可能是服務器掛了,也可能是網斷了

  5. 302 Move temporarily
    臨時重定向,表示資源臨時移動到新的位置。除了 302,301 也表示重定向,不過它是永久性的。重定向的時間會影響瀏覽器的緩存,如果是永久性的,那么瀏覽器會把重定向的結果記錄下來,后續再次訪問就會直接訪問重定向的目標地址,不用多一次跳轉了;而如果是臨時性的,那就不太方便緩存了
    重定向報文的響應中會有一個特殊的 header:Location,它描述了重定向的目標地址在哪兒

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

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

相關文章

運動控制問題

第一類運動控制問題是指被控制對象的空間位置或軌跡運動發生改變的運動控制系統的控制問題。這類運動控制問題在理論上完全遵循牛頓力學定律和運動學原則。 1、運動控制問題 第1類運動控制的核心是研究被控對象的運動軌跡 、分析運動路徑、運動速度、加速度與時間的關系,常用…

深入解析PHP框架:Symfony框架詳解與應用

文章目錄 深入解析PHP框架:Symfony框架詳解與應用一、什么是Symfony?Symfony的優勢 二、Symfony的核心概念1. 控制器2. 路由3. 模板4. 服務容器5. 事件調度器 三、Symfony的主要功能1. 表單處理2. 數據庫集成3. 安全性4. 國際化5. 調試與日志 四、開發流…

記一次docker容器安裝MySQL,navicat無法連接報錯(10060錯誤)

今天在云服務器上使用docker部署mysql 8.0.11時,遇到了一個詭異的問題,在云服務器的docker容器內可以連接上mysql,然而在自己電腦上連接mysql時報錯:Can‘t connect to MySQL server on localhost (10060) 下面是網上搜尋的幾種可…

SpringMVC框架--個人筆記步驟總結

一、步驟 1.創建工程 2.加入springmvc依賴--pom.xml <!--springmvc依賴--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.10.RELEASE</version> </depend…

Camunda如何通過外部任務與其他系統自動交互

文章目錄 簡介流程圖外部系統pom.xmllogback.xml監聽類 啟動流程實例常見問題Public Key Retrieval is not allowed的解決方法java.lang.reflect.InaccessibleObjectException 流程圖xml 簡介 前面我們已經介紹了Camunda的基本操作、任務、表&#xff1a; Camunda組件與服務與…

Linux命令更新-Vim 編輯器

簡介 Vim 是 Linux 系統中常用的文本編輯器&#xff0c;功能強大、可擴展性強&#xff0c;支持多種編輯模式和操作命令&#xff0c;被廣泛應用于程序開發、系統管理等領域。 1. Vim 命令模式 Vim 啟動后默認進入命令模式&#xff0c;此時鍵盤輸入的命令將用于控制編輯器本身&…

Android ImageDecoder把瘦高/扁平大圖相當于fitCenter模式decode成目標小尺寸Bitmap,Kotlin

Android ImageDecoder把瘦高/扁平大圖相當于fitCenter模式decode成目標小尺寸Bitmap&#xff0c;Kotlin val sz Size(MainActivity.SIZE, MainActivity.SIZE)val src ImageDecoder.createSource(mContext?.contentResolver!!, uri)val bitmap ImageDecoder.decodeBitmap(sr…

【Playwright+Python】系列 Pytest 插件在Playwright中的使用

一、命令行使用詳解 使用 Pytest 插件在Playwright 中來編寫端到端的測試。 1、命令行執行測試 pytest --browser webkit --headed 2、使用 pytest.ini 文件配置 內容如下&#xff1a; [pytest] # Run firefox with UIaddopts --headed --browser firefox效果&#xff1…

云計算【第一階段(31)】PXE高效批量網絡裝機

一、系統安裝 1.1、系統裝機的三種引導方式 1. 硬盤 2. 光驅&#xff08; u 盤&#xff09; 3. 網絡啟動 pxe 1.2、系統安裝過程 加載boot loader Boot Loader 是在操作系統內核運行之前運行的一段小程序。通過這段小程序&#xff0c;我們可以初始化硬件設備、建立內存空間的映…

【CSS in Depth 2 精譯】3.1.2 邏輯屬性 + 3.1.3 用好邏輯屬性的簡寫形式

當前內容所在位置&#xff08;可進入專欄查看其他譯好的章節內容&#xff09; 第一章 層疊、優先級與繼承&#xff08;已完結&#xff09; 1.1 層疊1.2 繼承1.3 特殊值1.4 簡寫屬性1.5 CSS 漸進式增強技術1.6 本章小結 第二章 相對單位&#xff08;已完結&#xff09; 2.1 相對…

深入探討:CPU問題的深度分析與調優

引言 你是否曾經遇到過這樣的情況:系統運行突然變慢,用戶抱怨不斷,檢查后發現CPU使用率居高不下?這時候,你會如何解決?本文將詳細解析CPU問題的分析與調優方法,幫助你在面對類似問題時游刃有余。 案例分析:一次CPU性能瓶頸的解決過程 某知名互聯網公司在一次促銷活動…

《Python數據科學之一:初見數據科學與環境》

《Python數據科學之一&#xff1a;初見數據科學與環境》 歡迎來到“Python數據科學”系列的第一篇文章。在這個系列中&#xff0c;我們將通過Python的鏡頭&#xff0c;深入探索數據科學的豐富世界。首先&#xff0c;讓我們設置和理解數據科學的基本概念以及在開始任何數據科學項…

實變函數精解【4】

文章目錄 說明點集與測度可數集定義性質示例與有限集的關系應用 可列集定義種類不可列集性質應用與意義 有限集性質示例與無限集的區別應用 可數集&#xff08;Countable set&#xff09;和可列集&#xff08;Countably infinite set 或 Enumerable set&#xff09;可數集可列集…

怎樣把pptx課件轉換成word文檔

如果你還沒有安裝python-pptx和python-docx&#xff0c;請先運行以下命令&#xff1a; pip install python-pptx python-docx from pptx import Presentation from docx import Document import re# 函數&#xff1a;清理文本&#xff0c;移除特殊字符和控制字符 def clean…

每日Attention學習11——Lightweight Dilated Bottleneck

模塊出處 [TITS 23] [link] [code] Lightweight Real-Time Semantic Segmentation Network With Efficient Transformer and CNN 模塊名稱 Lightweight Dilated Bottleneck (LDB) 模塊作用 改進的編碼器塊 模塊結構 模塊代碼 import torch import torch.nn as nn import to…

qt 添加一個圖片控件

在Qt中&#xff0c;要添加一個圖片控件&#xff0c;你通常會使用QLabel或者QGraphicsView來顯示圖片。下面是使用QLabel來顯示圖片的一種方法&#xff1a; 使用 QLabel 顯示圖片 在Qt Designer中添加QLabel 打開你的Qt Designer。從工具箱中找到QLabel控件&#xff0c;并將其拖…

C#如何進行深度學習對行人進行識別?

C#通常不是用于深度學習的主要語言,但是通過一些庫和框架,你可以輕松地在C#中實現深度學習。以下是使用C#進行深度學習的一些更詳細的步驟: 選擇合適的庫: ML.NET:這是微軟推出的一個機器學習庫,它很容易集成到.NET應用程序中。ML.NET支持廣泛的機器學習任務,包括深度學…

使用DeepWalk 和Word2Vec實現單詞Embedding

0、準備“邊”數據集Wiki_edgelist import pandas as pddf pd.read_csv(./data/wiki/Wiki_edgelist.txt, sep , headerNone, names["source", "target"]) df.head() 1、讀入 起點-終點 邊數據&#xff0c;構建圖 # 1、讀入 起點-終點 邊數據&#xff0c…

GIS就業相關問題快問快答

目錄 前言1.現在處于經濟下行期&#xff0c;GIS就業崗位是否減少了&#xff1f;2.我未來的打算是進體制內研發崗&#xff0c;這方面需要掌握哪些技能呢&#xff1f;3.GIS前端需要掌握哪些知識&#xff1f;4.GIS后端需要掌握哪些知識&#xff1f;5.不論是前端還是后端&#xff0…

編程語言都是哪些人開發出來的?為什么都是國外較小國家的人

編程語言都是哪些人開發出來的&#xff1f; 編程語言的開發者通常是來自計算機科學、軟件工程、數學、物理學等領域的專家、學者和工程師。這些開發者具備深厚的編程技能、算法知識、系統設計能力以及創新思維&#xff0c;他們致力于創造出能夠解決特定問題或滿足特定需求的編…