1. 程式人生 > 其它 >高階前端進階,你知道http有幾個版本嗎?

高階前端進階,你知道http有幾個版本嗎?

技術標籤:高階前端進階http

前言:

http全稱為超文字傳輸協議,本文將會盡量精簡的將http發展中經歷的幾個版本介紹出來。

HTTP 0.9

非常簡單,純文字格式,沒有狀態碼以及錯誤程式碼等。

  1. 只支援get請求
  2. 單次TCP連結只接受一次請求,請求完畢後TCP連結會關閉。

請求示例:

GET https://www.baidu.com

響應示例

<HTML>
簡單的html
</HTML>

HTTP 1.0

我們現在使用的HTTP 1.1版本的一個雛形,

  1. 增加了POSTHEAD等方法。
    • HEAD:請求資源頭部資訊,可以用來預檢測資訊,節約伺服器資源,比如判斷資源大小、或者判斷資源是否存在
  2. 增加相應狀態碼(HTTP Status Code)
    • 1xx 資訊,伺服器收到請求,需要請求者繼續執行操作(這個狀態碼是HTTP1.1新增的,為了方便檢視,所以寫在了這裡)
    • 2xx 成功,操作被成功接收並處理
    • 3xx 資源重定向
    • 4xx 客戶端錯誤
    • 5xx 服務端錯誤
  3. 多字符集支援
  4. 多部分發送(multi-parttype
  5. 許可權(authorization
  6. 快取(cache
  7. 內容編碼(contentencoding
  8. 可傳輸圖片、js、css等檔案

缺點:

  1. TCP連線無法複用,每次請求完成後TCP連線會關閉,每次請求都需要重新建立TCP連線
  2. 訊息請求時沒有傳遞hostname,導致請求的資源必須儲存在當前伺服器。
  3. 資料未加密

注意:

隊頭阻塞

當前請求傳送後,伺服器處理請求,當請求處理時間過長時,會發生隊頭阻塞,只有在當前請求響應後才會發出下一次請求。

HTTP 1.1(目前正在使用的版本)

  1. 支援host頭,允許不同域名配置在同一IP地址的伺服器上。
  2. 連線可複用,同一TCP連線可以傳送多個請求,當前請求被伺服器處理完畢才會處理下一請求,如果當前請求迴應特別慢,這時候就會發生隊頭堵塞。
    • 每個域名瀏覽器規定最多同時開6個TCP
  3. 持久連線(connection:keep-alive),預設開啟,如果客戶端或瀏覽器沒有斷開操作,那麼TCP連線會一直保持。
  4. 新增PUT、 DELETE等方法。(RESTFUL風格介面)

注意:

隊頭阻塞:

http1.1允許一個TCP連線傳送多個請求,不必等到上一個請求響應,就可以傳送下一個請求,但是,伺服器響應需要根據請求接收順序,先接受的請求先響應回去。如果最先發出的請求響應慢的話,就會影響其他請求的響應,這樣就造成了對頭阻塞。

管道化

賦予了客戶端在一個TCP連線中連續傳送多個請求的能力,而不需要等到前一個請求響應,這大大提高了效率。

HTTP 2.0

1. 頭部壓縮

為什麼要進行頭部壓縮

在普通HTTP請求中分為三部分,[請求頭、訊息主體、狀態行],其中訊息主體可以通過gzip壓縮,而請求頭跟狀態行沒辦法進行壓縮,隨著web功能越來越複雜,一個頁面的請求也越來越多,而頭資訊中有著大量的資料不會頻繁變動,但是又要隨每次請求傳送,導致大量流量浪費,所以HTTP2.0引入了頭部壓縮技術。

頭部壓縮詳解

在請求中header內會有很多重複的資訊傳送,HTTP2.0使用 ,伺服器客戶端各快取一份header fields表,用來避免重複的資訊傳輸。

2. 二進位制分幀

資料採用二進位制格式傳輸,這樣解析效率更高效,其中頭資訊會放入HEADERS幀,資訊體會放入DATA幀,這些幀可以亂序傳送,伺服器接收到後根據每個幀的流識別符號重新組裝。(HTTP1.x資料傳輸採用的是文字格式傳輸)

HTTP2.0把協議通訊的基本單位縮小為一個一個的幀,這些幀並行的在同一個TCP請求上交換訊息。

2. 多路複用

為什麼用多路複用?
瀏覽器限制同域名下最多建立6個TCP連結,每個連結如果其中一個請求的響應卡主,後面的請求就會一直等待響應,會造成阻塞。

多路複用
所有請求都是通過一個TCP連結併發完成。多路複用對同一域名下的請求都是基於流,

每個請求都可以看做是一個流,每個幀上都有一個流標識,而不同的流在交錯傳送,當伺服器收到訊息後會拼接同一個流的幀組成一整塊資料。

3. 請求優先順序

  • 圖片優先順序<css<js檔案

每個http2.0中的流都有個優先順序,高優先順序的流會優先發送。

4. 伺服器推送

伺服器可以對一個客戶端請求傳送多個響應。當客戶端請求某個頁面時,伺服器可以主動將頁面內引入的圖片、jscss主動推送至客戶端,節約請求時間以及流量。

總結:

http2.0的多路複用以及二進位制分幀可以使請求通過幀交錯的請求至伺服器,而且同一域名只需要建立一個TCP連線,這樣一來,我們在http1.x中使用的js合併就沒有意義了(js合併是為了減少請求數)。

如果想獲取更多內容,可以掃描下方二維碼,一起學習,一起進步。
左道前端