你必須要知道的HTTP協議原理


1 基本概念

HTTP協議:基於TCP協議之上實現的無狀態、全文本的標准通信協議。

客戶端:例如pc瀏覽器,移動應用端,第三方服務器等能發起http訪問的設備。

服務器:能夠接受HTTP協議請求,並且通常能夠正常返回響應結果給客戶端的設備。

 

 

 

HTTP協議其實說起來很簡單,它有兩個重要特性:純文本,無狀態。理解了這兩個特性,基本就掌握了HTTP的核心思想了。其它知識,無非是應該各種場景下制定的協議細節。

 

純文本:

TCP協議保證兩個計算機直接的穩定通信,TCP報文傳輸的數據部分在HTTP協議里面就存放的是HTTP純文本。

解決這個,最簡單的就是安裝一個抓包工具查看一下傳輸報文的格式,這里我們以Fiddler為例子,抓取訪問知乎首頁的請求。你可以很明顯的看出來,請求和響應全部都是以純文本方式交互。

 

 

無狀態:

這個特性說的是:只依賴協議本身的定義,服務器無法區分連續的兩次請求是否屬於同一個客戶端。有點抽象,這個等到最后說session與cookie時候一起說。

 

 


2 Get與Post請求的區別

 

這個問題老生常談了,我面試時候也經常會問。

從協議的角度來的,區別如下:

 

 

區別就是請求開頭第一行的標識符號,你是傳GET還是POST,此外從傳輸角度來看沒有任何區別!!!

網上千篇一律的什么URL傳參,BODY傳參,大小限制,安全限制之類的,基本都是各種框架、工具在具體工程實現上面的細節區分。

 


3 Json與Form表單,Content-Type請求頭

現在RESTFUL API大行其道,但是早幾年還是表單提交的天下,不過在做項目的過程中有時候還是會碰到要求表單提交的api,例入某訊家的接口。

所以還是有必要體會一下兩者的不同,如下圖:

 

 

同時對應的Content-Type請求頭會有不同:

application/x-www-form-urlencoded

application/json


4 Cookie與Session

 

cookie:客戶端保存的關於特定域名的服務器相關聯數據。

session: 同一個客戶端,一定時間段內的請求過程。

 

前文我們說過,無狀態特性決定了,只依賴協議本身的定義,服務器無法區分連續的兩次請求是否屬於同一個客戶端。我們先看圖:

 

 

服務器無法區分兩個請求分別屬於誰的,雖然你看圖列子,兩個線是直接鏈接到不同的兩個客戶端的。但是,請注意關測HTTP請求的文本:

 

 

服務器收到像這樣的純文本,它如何從中推斷出,是哪個客戶端發出的請求呢?

答案是判斷不了,條件不足。

聰明的你,可能已經想到了:在傳輸的文本中添加客戶端相關的信息,不就可以識別特定客戶端了嗎?是的,工程界就是這么實現的,通常會借助於一個在客戶端存儲cookie來,近幾年localstorage存儲也大行其道,目的都是標識客戶端歸屬。

 

 

5 Https請求

上文中有說到,http是純文本,既然是純文本,那我如果在通信過程中,例如在某一個路由中攔截請求,直接就可以看到所有明文,極為不安全。所以才有了SSL、TLS協議,給傳輸加個密。

這里有一個誤區,SSL、TLS協議是直接在TCP傳輸層面做的加密,而不是在HTTP協議之上做封裝。另外,建立傳輸開始過程中才會做不對稱加密算法如RSA做證書驗證,而在傳輸過程中,還是使用的對稱加密算法如DES等。

 

 


6 1台服務器能同時處理多少客戶端請求?

這個問題很有意思,先說答案:取決於網絡帶寬與服務器內存。

首先要明確一點是,物理規律無法打破。服務器與外界通信只靠一根網線。

所以網絡帶寬會限制鏈接客戶端數量。

其次,每次建立一個連接,服務都會在內存中保持連接句柄,所以跟內存也會相關。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM