談一談網絡協議中的應用層

文章目錄

  • 一,什么是HTTP
  • HTTP的優缺點
  • HTTPS

一,什么是HTTP

我們在通過網絡進行傳輸數據時,我們要保證,我們在發送時構造的數據,在接收時也能夠解析出來,這本質上就是一種協議,是一種應用層協議,我們的程序員可以自定義這種協議,但實際上已經有大佬為我們寫出了更靠譜的協議,就是HTTP。其是一種超文本傳輸協議。

那么這種協議到底是什么呢?
當我們去訪問某個網頁時,其先是會將我們的請求通過HTTP請求的方式,發送給服務器,然后服務器再回復給客戶端對應的HTTP響應。

我們先來看HTTP請求中有什么。
在這里插入圖片描述
其由首行+Header+Body組成。
我們先來看頭部:
在這里插入圖片描述
它由方法+url+版本組成。
那么什么是方法呢?
下圖就是HTTP的方法
在這里插入圖片描述
那么這些方法有什么區別呢?
我們以常用的GET和POST來說。GET請求的參數一般寫在url中。URL 規定只能支持 ASCII,所以 GET 請求的參數只允許 ASCII 字符 ,而且瀏覽器會對 URL 的長度有限制,通常為2048個字符。(HTTP協議本身對 URL長度并沒有做任何規定)。

POST 請求攜帶數據的位置一般是寫在報文 body 中,body 中的數據可以是任意格式的數據,只要客戶端與服務端協商好即可,而且瀏覽器不會對 body 大小做限制。

因為GET請求將參數放在URL中,所以容易泄漏信息,例如我們在網頁上就行用戶密碼登錄時,若用GET請求,就會將用戶名和密碼都顯式在URL中,從而暴露了我們的個人信息。

在 HTTP 協議里,所謂的「安全」是指請求方法不會「破壞」服務器上的資源。
所謂的「冪等」,意思是多次執行相同的操作,結果都是「相同」的。

如果從 RFC 規范定義的語義來看:
GET 方法就是安全且冪等的,因為它是「只讀」操作,無論操作多少次,服務器上的數據都是安全的,且每次的結果都是相同的。所以,可以對 GET 請求的數據做緩存,這個緩存可以做到瀏覽器本身上(徹底避免瀏覽器發請求),也可以做到代理上(如nginx),而且在瀏覽器中 GET 請求可以保存為書簽。

POST 因為是「新增或提交數據」的操作,會修改服務器上的資源,所以是不安全的,且多次提交數據就會創建多個資源,所以不是冪等的。所以,瀏覽器一般不會緩存 POST 請求,也不能把 POST 請求保存為書簽。

GET方法與POST方法的區別:

安全性:POST方法比GET方法更安全,因為它將數據作為請求主體發送,而不是明文暴露在URL中。
數據量:POST方法沒有數據量限制,而GET方法受到URL長度的限制。
數據類型:POST方法可以發送各種類型的數據,而GET方法主要用于發送文本數據。
緩存:POST方法不會被瀏覽器緩存,而GET方法可能會被緩存。

我們再來談談URL。
我們平時所說的網址就是URL,其包括這幾部分:
在這里插入圖片描述
最后一個版本就是HTTP的版本,再進行通信時,不同的版本則應該對應用同一版本進行解析。

看完首行,我們再來看看Header部分
在這里插入圖片描述

HTTP 是基于 TCP 傳輸協議進行通信的,而使用了 TCP 傳輸協議,就會存在一個“粘包”的問題,HTTP 協議通過設置回車符、換行符作為 HTTP header 的邊界,通過 Content-Length 字段作為 HTTP body的邊界,這兩個方式都是為了解決“粘包”的問題

看完了HTTP請求,我們再來看看HTTP的響應。
在這里插入圖片描述

HTTP的響應包括:首行+Header+BODY.
我們來看首部:其包括版本號+狀態碼+狀態碼解釋。
版本號我們上面提到過,那么什么是狀態碼呢?

HTTP狀態碼
在這里插入圖片描述

「200 OK」是最常見的成功狀態碼,表示一切正常。如果是非 HEAD 請求,服務器返回的響應頭都會有 body 數據。

「204 No Content」也是常見的成功狀態碼,與 200 OK 基本相同,但響應頭沒有 body 數據。

「206 Partial Content」是應用于 HTTP 分塊下載或斷點續傳,表示響應返回的 body數據并不是資源的全部,而是其中的一部分,也是服務器處理成功的狀態。

301 Moved Permanently」表示永久重定向,說明請求的資源已經不存在了,需改用新的 URL 再次訪問。

302 Found」表示臨時重定向,說明請求的資源還在,但暫時需要用另一個 URL 來訪問

301 和 302 都會在響應頭里使用字段 Location,指明后續要跳轉的 URL,瀏覽器會自動重定向新的 URL。

301 和 302 都會在響應頭里使用字段 Location,指明后續要跳轉的 URL,瀏覽器會自動重定向新的 URL。

「304 Not Modified」不具有跳轉的含義,表示資源未修改,重定向已存在的緩沖文件,也稱緩存重定向,也就是告訴客戶端可以繼續使用緩存資源,用于緩存控制。

「400 Bad Request」表示客戶端請求的報文有錯誤,但只是個籠統的錯誤。

「403 Forbidden」表示服務器禁止訪問資源,并不是客戶端的請求出錯。

「404 Not Found」表示請求的資源在服務器上不存在或未找到,所以無法提供給客戶端。

「500 Internal Server Error」與 400 類型,是個籠統通用的錯誤碼,服務器發生了什么錯誤,我們并不知道。

「501 Not Implemented」表示客戶端請求的功能還不支持,類似“即將開業,敬請期待”的意思。

「502 Bad Gateway」通常是服務器作為網關或代理時返回的錯誤碼,表示服務器自身工作正常,訪問后端服務器發生了錯誤。

「503 Service Unavailable」表示服務器當前很忙,暫時無法響應客戶端,類似“網絡服務正忙,請稍后重試”的意思

HTTP的優缺點

對于一些具有重復性的 HTTP 請求,比如每次請求得到的數據都一樣的,我們可以把這對「請求-響應」的數據都緩存在本地,那么下次就直接讀取本地的數據,不必在通過網絡獲取服務器的響應了,這樣的話 HTTP/1.1 的性能肯定肉眼可見的提升。

所以,避免發送 HTTP 請求的方法就是通過緩存技術,HTTP 設計者早在之前就考慮到了這點,因此 HTTP 協議的頭部有不少是針對緩存的字段。

HTTP 緩存有兩種實現方式,分別是強制緩存和協商緩存。

HTTP的優點:
簡單,易擴展,跨平臺性。

缺點:
HTTP是無狀態的,也就是說,對于一些網頁來說,像是淘寶,我們的每一次請求都要進行用戶驗證,這樣對用戶顯然是不友好的,所以就有了cookie的出現。
我們先來看第一種情形:我們在網頁登錄后,若用POST請求,則我們的登錄信息則會填寫到請求的body中,服務器讀到后,會與其數據庫中的信息進行校驗,成功后才會返回對應的信息,這時我們的瀏覽器中也會對我們的登錄信息進行保存,保存在cookie中,當要繼續訪問時發送請求時,則填認證信息的過程則由瀏覽器幫助我們去做了,這樣看似方便了,但是是有問題的,當有人在我們的電腦中植入木馬,對我們的cookie進行掃描時,我們的信息是不是就泄漏啦。(cookie存儲在本地)。那么有什么辦法嗎?有的!
我們在登錄之后不再直接用密碼進行驗證不就可以了。
當我們的客戶端將用戶名,密碼通過請求發送到服務器上時,在服務器中,會有一個哈希表的東西,其內容是,我們的登錄信息和服務器為我們分配的一個session id,這兩個值是一一映射的關系,然后服務器將這個id返回給客戶端,此時瀏覽器保存的就是我們的id了,當再要進行驗證時,就通過id直接與服務器進行驗證。我們的信息也就不會泄露了,但是!仍然是不安全的,因為我們的HTTP是明文傳輸的,黑客可以通過抓包,從而拿到我們的id從而登錄我們的賬號。
有什么辦法解決嗎?有的!HTTPS。

HTTPS

因為http的內容是明?傳輸的,明?數據會經過路由器、wifi熱點、通信服務運營商、代理服務器等多個物理節點,如果信息在傳輸過程中被劫持,傳輸的內容就完全暴露了。劫持者還可以篡改傳輸的信息且不被雙?察覺,這就是 中間?攻擊 ,所以我們才需要對信息進?加密。

那么它是怎么進行加密的呢?
我們的加密有對稱加密和非對稱加密。
我們來看一種最接近我們HTTPS加密方式的加密方法。
非對稱加密+對稱加密
客戶端發送連接請求給服務器,服務器發送公鑰給客戶端,客戶端用公鑰加密密鑰R(R進行的是對稱加密)發送給服務器,然后服務器用私鑰解密,最后兩個主機通過對稱密鑰R進行通信,但是改方法是有問題的,要是有中間人在開始時就進行攻擊,即在向客戶端發送公鑰時就進行攻擊,將公鑰換成自己的公鑰給客戶端,從而就拿到了客戶端的密鑰R。那么怎么解決呢?本質就是將服務器傳給客戶端的公鑰保護起來。
我們利用CA證書對公鑰進行保護。
先是服務端向CA機構申請,CA機構有一把公鑰和私鑰,其先是用對證書的信息進行哈希,形成摘要,然后對該摘要用私鑰加密,形成數字簽名,在建立連接時,服務器發送帶簽名的證書給客戶端,該證書中包含服務器的公鑰和網站信息,所以要是有中間人進行攻擊時,由于其只要對證書的內容進行更改,客戶端在收到證書,對其進行哈希形成摘要,再用CA機構的公鑰對簽名進行解密,若摘要不匹配,則是不合法的,這就避免了上述的中間人攻擊的場景。服務器的公鑰就得到了保護,然后用該公鑰加密客戶端的密鑰R,給服務器后,兩主機就進行對稱加密從而通信了。

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

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

相關文章

Spring Cloud + Vue前后端分離-第3章 SpringBoot項目技術整合

Spring Cloud Vue前后端分離-第3章 SpringBoot項目技術整合 3-1 集成持久層框架Mybatis ORM:對象關系映射,Hibernate是全自動ORM,Mybatis是半自動ORM,Mybatis可以操作的花樣更多,是首選的持久層框架 System模塊集成Mybatis框架…

整數分析 C語言xdoj43

問題描述 給出一個整數n&#xff08;0<n<100000000&#xff09;。求出該整數的位數&#xff0c;以及組成該整數的所有數字中的最大數字和最小數字。 輸入說明 輸入一個整數n&#xff08;0<n<100000000&#xff09; 輸出說明 在一行上依次輸出整數n的位…

Linux內核上游提交完整流程及示例

參考博客文章&#xff1a; 向linux內核提交代碼 - 知乎 一、下載Linux內核源碼 通過git下載Linux內核源碼&#xff0c;具體命令如下&#xff1a; git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 實際命令及結果如下&#xff1a; penghaoDin…

IBM Qiskit量子機器學習速成(六)

量子卷積神經網絡 卷積和池化&#xff1a;卷積神經網絡的必備成分 卷積神經網絡被廣泛應用于圖像和音頻的識別當中&#xff0c;關鍵在于“卷積”操作賦予神經網絡統籌學習數據的能力。 執行卷積操作需要輸入數據與卷積核&#xff0c;卷積核首先與輸入數據左上角對齊&#xf…

【數據庫】簡單連接嵌套查詢

目錄 &#x1f387;簡單查詢 &#x1f387;連接查詢 &#x1f387;嵌套查詢 分析&思考 &#x1f387;簡單查詢 --練習簡單查詢 --select * from classes --select * from student --select * from scores --1.按Schedule表的結構要求用SQL語言創建Schedule表 --字段名…

深度學習之全面了解預訓練模型

在本專欄中&#xff0c;我們將討論預訓練模型。有很多模型可供選擇&#xff0c;因此也有很多考慮事項。 這次的專欄與以往稍有不同。我要回答的問題全部源于 MathWorks 社區論壇&#xff08;ww2.mathworks.cn/matlabcentral/&#xff09;的問題。我會首先總結 MATLAB Answers …

關于Linux Kernel Panic導致重啟的簡單分析步驟

Linux系統Kernel Panic的檢索 如何判斷是否發生Kernel Panic&#xff0c;以下以 CentOS 7.9系統為例 #查看 /var/crash 路徑下是否有生成文件夾&#xff0c;Kernel Panic后會生成文件夾在此路徑表示產生了Kernel Panic ls /var/crash #/var/crash/127.0.0.1-2023-12-04-08\:5…

HarmonyOS應用開發者基礎認證考試(穩過)

判斷題 ??????? 1. Web組件對于所有的網頁都可以使用zoom(factor: number)方法進行縮放。錯誤(False) 2. 每一個自定義組件都有自己的生命周期正確(True) 3. 每調用一次router.pushUrl()方法&#xff0c;默認情況下&#xff0c;頁面棧數量會加1&#xff0c;頁面棧支持的…

linux redis-cluster ipv6方式

配置文件&#xff0c;具體字段的含義&#xff0c;可以參考其他文檔。 1.單個文件的配置信息 redis_36380.conf requirepass Paas_2024port 36380tcp-backlog 511timeout 0tcp-keepalive 300daemonize yessupervised nopidfile /data/paas/apps/aicache-redis/redis_36380.p…

【STM32】TIM定時器編碼器

1 編碼器接口簡介 Encoder Interface 編碼器接口 編碼器接口可接收增量&#xff08;正交&#xff09;編碼器的信號&#xff0c;根據編碼器旋轉產生的正交信號脈沖&#xff0c;自動控制CNT自增或自減&#xff0c;從而指示編碼器的位置、旋轉方向和旋轉速度 接收正交信號&#…

黑豹程序員-EasyExcel實現導出

需求 將業務數據導出到excel中&#xff0c;老牌的可以選擇POI&#xff0c;也有個新的選擇EasyExcel。 有個小坑&#xff0c;客戶要求樣式比較美觀&#xff0c;數字列要求千位符&#xff0c;保留2位小數。 可以用代碼實現但非常繁瑣&#xff0c;用模板就特別方便&#xff0c;模…

C++優秀串口庫

serial::Serial Class Reference #include <serial.h> Data Structures class ScopedReadLockclass ScopedWriteLock Public Member Functions公有成員方法&#xff08;編程用的都在這里了&#xff0c;那些私有的如果不開源一般跟我們沒有關系了&#xff09; Serial …

用chatGPT開發項目:我想的無人的智慧樹網站 流量之神 利用人工智能的算法將人吸引住 GPT4是不是越來越難用了,問一下就要證明一下自己是不是人類

廣度發散&#xff1a;讓AI給出時代或今日或你關注的熱點事件 比如采集新聞頭條&#xff0c;根據內容或標題&#xff0c;以不同的角度&#xff0c;或各種人群的角色&#xff0c;生成50篇簡短的文章。一下就能占傳統的搜索引擎。這是AI最擅長的【千人千面&#xff0c;海量生成】…

【中國海洋大學】操作系統隨堂測試6整理

1. IO系統的層次機構包括&#xff1a;IO硬件、中斷處理程序、&#xff08;&#xff09;程序、設備獨立性軟件、用戶層軟件。 答&#xff1a;設備驅動 2. IO設備和控制器之間的接口包括三種類型的信號&#xff1a;數據信號線、控制信號線和&#xff08;&#xff09;&#xff1…

qt反射基礎

最近研究了一下QT的反射機制&#xff0c; Qt的元對象系統除了提供信號/槽機制的特性之外&#xff0c;它還提供了以下特性: QObject::metaObject() 返回關聯的元對象 QMetaObject::className() 在運行時狀態下返回類名 QObject::inherits() 判斷類的繼承關系 QObject::tr()&…

鴻蒙開發之封裝優化

面向對象開發離不開封裝&#xff0c;將重復的可以復用的代碼封裝起來&#xff0c;提高開發效率。 基于之前的List&#xff0c;對代碼進行封裝。 1、抽取component 將List的頭部抽離出來作為一個新的component。可以創建一個新的ArkTS文件&#xff0c;寫我們的頭部代碼 為了…

代理模式:解析對象間的間接訪問與控制

目錄 引言 理解代理模式 不同類型的代理模式 代理模式的應用場景 代理模式的優缺點 優點 缺點 實際案例&#xff1a;Java中的代理模式應用 結語 引言 代理模式是軟件設計模式中的一種結構型模式&#xff0c;旨在為其他對象提供一種代理以控制對這個對象的訪問。它允許你…

消息隊列使用指南

介紹 消息隊列是一種常用的應用程序間通信方法&#xff0c;可以用來在不同應用程序或組件之間傳遞數據或消息。消息隊列就像一個緩沖區&#xff0c;接收來自發送方的消息&#xff0c;并存儲在隊列中&#xff0c;等待接收方從隊列中取出并處理。 在分布式系統中&#xff0c;消…

死鎖問題,4個必要條件+避免死鎖

目錄 引入 死鎖 概念 示例 多把鎖 單鎖 4個必要條件 用途 引入 我們用加鎖的方式保證了多個線程訪問臨界資源時,不會出現數據紊亂的問題 但是,鎖的引入,會導致出現其他的問題 死鎖 概念 在多線程或多進程的并發環境中&#xff0c;兩個或多個進程或線程被永久阻塞&…

esxi全稱“VMware ESXi

esxi全稱“VMware ESXi”&#xff0c;是可直接安裝在物理服務器上的強大的裸機管理系統&#xff0c;是一款虛擬軟件&#xff1b;ESXi本身可以看做一個操作系統&#xff0c;采用Linux內核&#xff0c;安裝方式為裸金屬方式&#xff0c;可直接安裝在物理服務器上&#xff0c;不需…