Http1.1和http2.0
HTTP2.0
最近在讀一本書叫《web性能權威指南》谷歌公司高性能團隊核心成員的權威之作。
一直聽說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
而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連接的兩端都知道已經發送了哪些首部,這些首部的值是什麽,從而可以針對之前的數據只編碼發送差異數據。
Http1.1和http2.0