1. 程式人生 > >瞭解HTTP協議,這一篇就夠了

瞭解HTTP協議,這一篇就夠了

1、HTTP協議簡介

1.1、HTTP協議是超文字傳輸協議的簡稱,工作於應用層,用於從伺服器傳輸超文字到本地瀏覽器。HTTP協議本身是一種無狀態的,也沒法自己傳輸資料,底層的資料傳輸協議是TCP協議。HTTP協議工作於客戶端-服務端架構為上。瀏覽器作為HTTP客戶端通過URL向HTTP服務端即WEB伺服器傳送所有請求。Web伺服器根據接收到的請求後,向客戶端傳送響應資訊。

左圖為HTTP的請求-響應模型

1.2、HTTP歷史版本介紹

1.2.1、HTTP1.0最早在網頁中使用是在1996年,那個時候只是使用一些較為簡單的網頁上和網路請求上,而HTTP1.1則在1999年才開始廣泛應用於現在的各大瀏覽器網路請求中,同時HTTP1.1也是當前使用最為廣泛的HTTP協議。 主要區別主要體現在:

  1. 快取處理,在HTTP1.0中主要使用header裡的If-Modified-Since,Expires來做為快取判斷的標準,HTTP1.1則引入了更多的快取控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供選擇的快取頭來控制快取策略。

  2. 頻寬優化及網路連線的使用,HTTP1.0中,存在一些浪費頻寬的現象,例如客戶端只是需要某個物件的一部分,而伺服器卻將整個物件送過來了,並且不支援斷點續傳功能,HTTP1.1則在請求頭引入了range頭域,它允許只請求資源的某個部分,即返回碼是206(Partial Content),這樣就方便了開發者自由的選擇以便於充分利用頻寬和連線。

  3. 錯誤通知的管理,在HTTP1.1中新增了24個錯誤狀態響應碼,如409(Conflict)表示請求的資源與資源的當前狀態發生衝突;410(Gone)表示伺服器上的某個資源被永久性的刪除。

  4. Host頭處理,在HTTP1.0中認為每臺伺服器都繫結一個唯一的IP地址,因此,請求訊息中的URL並沒有傳遞主機名(hostname)。但隨著虛擬主機技術的發展,在一臺物理伺服器上可以存在多個虛擬主機(Multi-homed Web Servers),並且它們共享一個IP地址。HTTP1.1的請求訊息和響應訊息都應支援Host頭域,且請求訊息中如果沒有Host頭域會報告一個錯誤(400 Bad Request)。

  5. 長連線,HTTP 1.1支援長連線(PersistentConnection)和請求的流水線(Pipelining)處理,在一個TCP連線上可以傳送多個HTTP請求和響應,減少了建立和關閉連線的消耗和延遲,在HTTP1.1中預設開啟Connection: keep-alive,一定程度上彌補了HTTP1.0每次請求都要建立連線的缺點。

1.2.2、在 HTTP/2 的第一版草案(對 SPDY 協議的復刻)中,新增的效能改進不僅包括HTTP/1.1中已有的多路複用,修復隊頭阻塞問題,允許設定設定請求優先順序,還包含了一個頭部壓縮演算法(HPACK)。此外, HTTP/2 採用了二進位制而非明文來打包、傳輸客戶端—伺服器間的資料。

1.幀、訊息、流和TCP連線

有別於HTTP/1.1在連線中的明文請求,HTTP/2與SPDY一樣,將一個TCP連線分為若干個流(Stream),每個流中可以傳輸若干訊息(Message),每個訊息由若干最小的二進位制幀(Frame)組成。這也是HTTP/1.1與HTTP/2最大的區別所在。 HTTP/2中,每個使用者的操作行為被分配了一個流編號(stream ID),這意味著使用者與服務端之間建立了一個TCP通道;協議將每個請求分割為二進位制的控制幀與資料幀部分,以便解析。這個舉措在SPDY中的實踐表明,相比HTTP/1.1,新頁面載入可以加快11.81% 到 47.7%

2.HPACK 演算法

HPACK演算法是新引入HTTP/2的一個演算法,用於對HTTP頭部做壓縮

3.伺服器推送

網站為了使請求數減少,通常採用對頁面上的圖片、指令碼進行極簡化處理。但是,這一舉措十分不方便,也不高效,依然需要諸多HTTP連結來載入頁面和頁面資源。

HTTP/2引入了伺服器推送,即服務端向客戶端傳送比客戶端請求更多的資料。這允許伺服器直接提供瀏覽器渲染頁面所需資源,而無須瀏覽器在收到、解析頁面後再提起一輪請求,節約了載入時間。

 

2、HTTP協議特點

1.支援客戶/伺服器模式。
2.簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與伺服器聯絡的型別不同。由於HTTP協議簡單,使得HTTP伺服器的程式規模小,所以通訊速度很快。
3.靈活:HTTP允許傳輸任意型別的資料物件。正在傳輸的型別由Content-Type加以標記。
4.無連線:無連線的含義是限制每次連線只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間。
5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。

3、HTTP的Request資訊和Response資訊

3.1、請求訊息Request

客戶端傳送給伺服器一個HTTP請求資訊包括如下幾個部分:

請求行(request line):請求方法、請求資料和HTTP版本號

請求頭部(request header):伺服器的附加資訊

空行:這是必須的部分

請求資料(body):可以新增任何資料

3.2、請求資訊Response

伺服器接受並處理完request請求後,會返回給客戶端一個Response響應訊息

Response訊息由四個部分組成:

狀態行:HTTP版本號、狀態碼和狀態訊息

訊息報頭:Date:生成響應的日期和時間;Content-Type:指定了MIME型別的HTML(text/html),編碼型別是UTF-8

空行:空行是必須的,和request訊息裡一樣

響應正文:伺服器返回給客戶端HTML程式碼

4、HTTP狀態碼

4.1、狀態程式碼有三位數字組成,第一個數字定義了響應的類別,共分五種類別:

1xx:指示資訊--表示請求已接收,繼續處理

2xx:成功--表示請求已被成功接收、理解、接受

3xx:重定向--要完成請求必須進行更進一步的操作

4xx:客戶端錯誤--請求有語法錯誤或請求無法實現

5xx:伺服器端錯誤--伺服器未能實現合法的請求

4.2、常見狀態碼

200 OK //客戶端請求成功

400 Bad Request //客戶端請求有語法錯誤,伺服器無法理解

401 Unauthorized //請求未經授權

403 Forbidden //伺服器接受請求但是拒絕服務

404 Not Found //請求資源不存在

500 Internal Server Error //伺服器發生不可預期的錯誤

503 Server Unavailable //伺服器當前不能處理客戶端的請求,過一段時間可能恢復正常

5、HTTP請求方法

根據HTTP標準,HTTP請求可以使用多種請求方法。
HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

請求方法

功能

請求方法

功能

POST

向指定資源提交資料進行處理請求(例如提交表單或者上傳檔案)。資料被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。

HEAD

類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭

OPTIONS

允許客戶端檢視伺服器的效能

PUT

從客戶端向伺服器傳送的資料取代指定的文件的內容。

DELETE

請求伺服器刪除指定的頁面

TRACE

回顯伺服器收到的請求,主要用於測試或診斷。

CONNECT

HTTP/1.1協議中預留給能夠將連線改為管道方式的代理伺服器。

GET

請求指定的頁面資訊,並返回實體主體。

 

6、HTTP工作原理及流程

6.1工作原理

HTTP協議的工作原理很好理解,使用者通過客戶端向服務端發起一個請求,建立一個TCP連線,指定埠號,預設是80,然後連線到伺服器工作。在那個埠監聽瀏覽器請求。一旦監聽到客戶端請求,分析請求型別後,伺服器會向客戶端返回一個響應狀態,比如"HTTP/1.0 404 OK",同時會返回特定的資料內容,如請求的資源,錯誤程式碼,其它狀態資訊等等。

6.2工作流程

在瀏覽器位址列鍵入URL,按下回車之後會經歷以下流程:

1、瀏覽器向 DNS 伺服器請求解析該 URL 中的域名所對應的 IP 地址;

2、解析出 IP 地址後,根據該 IP 地址和預設埠 80,和伺服器建立TCP連線;

3、瀏覽器發出讀取檔案(URL 中域名後面部分對應的檔案)的HTTP 請求,該請求報文作為 TCP三次握手的第三個報文的資料傳送給伺服器;

4、伺服器對瀏覽器請求作出響應,並把對應的 html 文字傳送給瀏覽器;

5、釋放 TCP連線

6、瀏覽器將該 html 文字並顯示內容;

首發於頭條號:https://www.toutiao.com/i6622938378771890696/

歡迎訪問哦