前端性能優化的另一種方式——HTTP2.0


一直聽說HTTP2.0,對此也僅僅是耳聞,沒有具體研讀過,這次正好有兩個篇章,分別講HTTP1.1和HTTP2.0。

兩者還能好好對比一下,兩者之間的巨大區別,以及HTTP2.0解決了哪些實際問題。

無論什么網絡,也不管所用網絡協議是什么版本,所有應用都應該致力於消除或減少不必要的網絡延遲將需要傳輸的數據壓縮至最少

HTTP2.0就是為了做這些優化而出現的。

 

一、HTTP1.1的幾個特點

1)持久連接

每個TCP連接開始都有三次握手,要經歷一次客戶端與服務器間完整的往返,而開啟了持久化連接就能不必每次都要握手。

在連接中有這個屬性的就是打開了持久化連接。下圖展示了通過持久 TCP 連接取得 HTML 和 CSS 文件:

 

2)HTTP管道

持久HTTP多次請求必須嚴格滿足先進先出(FIFO)的隊列順序:發送請求,等待響應完成,再發送客戶端隊列中的下一個請求。

HTTP管道可以讓我們把FIFO隊列從客戶端(請求隊列)遷移到服務器(響應隊列)。

這樣的話在第一個請求完成后,能馬上開始處理第二個請求。

但HTTP 1.x不允許一個連接上的多個響應數據交錯到達(多路復用),因而一個響應必須完全返回后,下一個響應才會開始傳輸。

也就是說即使客戶端同時發送了兩個請求,而且CSS資源先准備就緒,服務器也會先發送HTML響應,然后再交付CSS

而HTTP2.0就可以多路復用,並可以按優先級返回響應。

 

3)度量和控制協議開銷

HTTP 1.0增加了請求和響應首部,以便雙方能夠交換有關請求和響應的元信息。

很少改變的接收和傳輸首部、緩存指令、cookie等,所有這些未經壓縮的HTTP元數據經常會給每個HTTP請求增加幾千字節的協議開銷

YSlow中有23條規則,第20條就是“Use Cookie-Free Domains for Components”,請求的時候將cookie去除。

而在HTTP2.0中可以首部壓縮,減少上面的開銷提升性能。

 

4)連接與拼合

快的請求是不用請求,減少請求次數總是最好的性能優化手段。

HTTP 1.x中,可以考慮把多個資源捆綁打包到一塊,通過一次網絡請求獲取。

而在HTTP2.0中可以多向請求和響應,消除了請求多個資源就要使用多個TCP連接的限制。

 

5)嵌入資源

把資源嵌入文檔可以減少請求的次數。

比如,JavaScript和CSS代碼,通過適當的script和style塊可以直接放在頁面中。

而圖片甚至音頻或PDF文件,都可以通過數據URI(data:[mediatype][;base64],data)的方式嵌入到頁面中。

而在HTTP2.0中有個服務器推送,與嵌入資源唯一的不同就是可以把這個過程從應用中拿出來,放到HTTP協議本身來實現。

 

二、HTTP2.0的特點

1)二進制分幀層

HTTP 2.0性能增強的核心,全在於新增的二進制分幀層,它定義了如何封裝HTTP消息並在客戶端與服務器之間傳輸。

接下來說的幾個特點都是基於這個機制來實現的。

 

2)流、消息和幀

所有HTTP 2.0通信都在一個連接上完成,這個連接可以承載任意數量的雙向數據流。

每個數據流以消息的形式發送,而消息由一或多個幀組成,這些幀可以亂序發送,然后再根據每個幀首部的流標識符重新組裝。

簡言之,HTTP 2.0把HTTP協議通信的基本單位縮小為一個一個的幀,這些幀對應着邏輯流中的消息。

相應地,很多流可以並行地在同一個TCP連接上交換消息。

 

3)多向請求與響應

在HTTP 1.x中,如果客戶端想發送多個並行的請求以及改進性能,那么必須使用多個TCP連接。

HTTP 2.0中的二進制分幀層突破了限制:客戶端和服務器可以把HTTP消息分解為互不依賴的幀,然后亂序發送,最后再在另一端把它們重新組合起來。

 

4)請求優先級

把HTTP消息分解為很多獨立的幀之后,就可以通過優化這些幀的交錯和傳輸順序,進一步提升性能。

為了做到這一點,每個流都可以帶有一個31比特的優先值。

如果服務器不理睬優先值,可能導致應用響應變慢:瀏覽器明明在等關鍵的CSS和JavaScript,服務器卻在發送圖片,從而造成渲染阻塞。

 

5)每個來源一個連接

大多數HTTP連接的時間都很短,而且是突發性的,但TCP只在長時間連接傳輸大塊數據時效率才最高。

HTTP 2.0通過讓所有數據流共用同一個連接,可以更有效地使用TCP連接。

HTTP 2.0不僅能夠減少網絡延遲,還有助於提高吞吐量和降低運營成本!

 

6)服務器推送

服務器除了對最初請求的響應外,服務器還可以額外向客戶端推送資源,而無需客戶端明確地請求。

 

7)首部壓縮

在HTTP1.x中,首部元數據都是以純文本形式發送的,通常會給每個請求增加500~800字節的負荷。

為減少這些開銷並提升性能,HTTP 2.0會壓縮首部元數據。

HTTP 2.0連接的兩端都知道已經發送了哪些首部,這些首部的值是什么,從而可以針對之前的數據只編碼發送差異數據。


免責聲明!

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



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