1. 使用二進制協議,簡化傳輸的復雜性,提高了效率
2. 支持一個 TCP 鏈接發起多請求,移除 pipeline
HTTP/2 移除了 HTTP/1.1中的管道化(pipeline)機制,轉而采用多路復用(Multiplexing)來支持多請求的高效傳輸。以下是幾點關鍵原因和實現方式:
管道化帶來的問題
在HTTP/1.1中,管道化可能導致隊頭阻塞(Head-of-Line Blocking),即一個請求的延遲會阻礙后續所有請求的處理。例如,如果第一個請求因為網絡問題延遲,后續請求必須等待,導致資源利用率低下。
多路復用的好處
- 獨立流(Streams):HTTP/2將每個請求和響應分割為獨立的流,每個流都有獨特的標識符。這種機制允許在一個TCP連接上同時傳輸多個流,互不干擾。
- 二進制分幀(Binary Framing):數據被分割為更小的二進制幀,每幀包含流標識符,確保服務器和客戶端能正確處理和組裝數據,避免阻塞。
新增優先級機制
HTTP/2允許客戶端為每個流設定優先級,服務器據此分配帶寬,確保高優先級請求優先處理,優化資源使用和用戶體驗。
總結而言,HTTP/2通過多路復用替代了管道化,利用獨立流、二進制分幀和優先級機制,顯著提升了多請求傳 輸的效率和性能,解決了HTTP/1.1中的隊頭阻塞問題。
3. 使用HPACK算法來壓縮HTTP頭部,從而減少數據傳輸量,提高傳輸效率。
具體來說,HPACK是HTTP/2協議中使用的一種高效的頭部壓縮算法,它可以減少重復的頭字段傳輸,降低數據傳輸的開銷。以下是HTTP利用HPACK壓縮頭部的主要步驟:
靜態表和動態表
- 靜態表(Static Table):HPACK算法內置了一個靜態表,包含了一些常見的HTTP頭字段,如Content-Type、User-Agent等。這些頭字段在HTTP通信中經常出現,因此不需要每次都傳輸它們的全名。
- 動態表(Dynamic Table):除了靜態表,HPACK還會動態維護一個表,記錄本次會話中已經傳輸過的頭字段。這樣,如果某個頭字段在之前的請求或響應中出現過,后續就可以通過索引的方式引用,而不必再次傳輸完整的頭字段。
索引編碼
- 每個頭字段都可以通過索引的方式引用靜態表或動態表中的條目。例如,如果某個頭字段已經在動態表中存在,HTTP/2客戶端或服務器可以直接發送該條目的索引,而不是傳輸整個頭字段。
字面量編碼
- 對于未在靜態表或動態表中出現過的頭字段,HPACK會使用字面量編碼進行傳輸。字面量編碼包括頭字段的名稱和值,但在傳輸時可以對其進行進一步壓縮。
動態表的更新
- 傳輸新的頭字段后,這些字段會被添加到動態表中,供后續的請求或響應重復使用。動態表的大小是可以調整的,以適應不同的網絡環境。
避免壓縮膨脹
- HPACK還通過一些機制避免了壓縮膨脹的問題(即壓縮后的數據比原始數據更大)。例如,HPACK不會對已經很小的頭字段進行壓縮,而是直接傳輸。
與HTTP/2的集成
- HPACK是HTTP/2協議的一部分,HTTP/2使用二進制分幀機制,進一步優化了頭部的傳輸。通過HPACK壓縮后的頭部會被分割成更小的塊進行傳輸,從而減少傳輸延遲。
4. 允許服務端主動推送數據
比如說,建立連接之后,瀏覽器請求了一個 html,那服務端把這個 html 的 css 和 js 都送過去,減少了請求次數。