一文理清Http2.0
前言
HTTP2.0主要有三大特性:二進制協議、頭部壓縮、服務端推送(Server Push)、多路復用。本文從分析http1.x存在的問題入手,逐一介紹http2.0的優勢。
Http1.x存在的問題
在HTTP1.0下,HTTP1.1非Keep-Alive模式下,每個請求都要新建一個TCP連接,完成之后立即斷開連接,如果有新的請求,則要重新創建請求TCP連接。多次請求建立多次TCP會耗費大量時間,同時沒有必要。
為了解決這個問題, HTTP 1.1 中提供了Keep-Alive,允許一定時間(此時間在Nginx或Apache服務器配置上設定)內,同一域名多次請求數據,只建立一次HTTP請求,其他請求可復用TCP連接,以提高請求效率。
但是使用Keep-Alive后仍然存在問題:
單個 TCP 連接在一個時刻只能處理一個請求(必須等上一個請求返回才能發起下一個請求,所以后面的請求會被前面請求的阻塞)。所以實際上我們只是節省了建立連接的時間,而獲取數據的時間并沒有減少。
http1.1的單個 TCP 連接只能同步發請求的原因:http1.1是基于文本的協議,請求中的不同部分(請求頭、請求體)通過換行符進行分割。因此如果同一個TCP同時發多個請求會導致多個請求的數據混雜在一起,服務端無法正確解析請求。
Http2.0的特性
一、二進制協議
http1.x 是一個文本協議,而 http2.0 是一個徹徹底底的二進制協議,http2.0 的基本單位是幀。
HTTP2.0引入二進制數據幀和流的概念:
客戶端發送請求時,請求會被分解為多個幀(Frame),同一個請求的幀的 流標識符(Stream Identifier) 相同。每個請求可以理解為一個包含多個幀的流。
幀的格式:
字段解釋:
type的類型:
在二進制分幀層上,http2.0會將所有傳輸信息分割為幀,并對它們采用二進制格式的編碼將其封裝,新增的二進制分幀層同時也能夠保證http的各種動詞,方法,首部都不受影響,兼容上一代http標準。其中,http1.X中的首部信息header封裝到Headers幀中,而request body將被封裝到Data幀中。
二、多路復用 (Multiplexing) / 連接共享
有了新的分幀機制后,http/2 不再依賴多個TCP連接去實現多流并行:
每個數據流(請求或響應)都拆分成很多互不依賴的幀,因為具有標識字段(Stream id、flags)因此幀可以無序發送(即多個請求分解成幀可以通過一個TCP連接交錯發送),最后當幀到達服務端之后,就可以根據 Stream Identifier 來重新組合得到完整的請求。
http 2.0 的TCP連接都是持久化的,而且客戶端與服務器之間也只需要一個連接(每個域名一個連接)即可。此連接可以承載數十或數百個流的復用,多路復用意味著來自很多流的數據包能夠混合在一起通過同樣連接傳輸。當到達終點時,再根據不同幀首部的流標識符重新連接將不同的數據流進行組裝。
http1.X和http2.0在傳輸數據時的區別:
三、頭部壓縮
客戶端和服務器各自維護一張頭部信息表,所有頭部字段都會存入表中,生成一個索引號,發送過的頭部字段此后只發送對應的索引號。
相同的頭部信息不會通過請求發送,延用之前請求攜帶的頭部信息。新增/修改的頭部信息會被加入到HEAD中,兩端漸進更新。
兩端會共同維護一個head list,每次請求時都會進行檢查。
該list包括:
- static (既定的頭部信息)
- dynamic (自定義的頭部信息)
四、服務端推送
例如我們加載index.html, 我們可能還需要index.js, index.css等文件。傳統的請求只有當拿到index.html,解析html中對index.js/index.css的引入才會再請求資源加載,但是通過服務端推送,可以提前將資源推送給客戶端,這樣客戶端要用到的時候直接調用即可,不用再發送請求。
當服務端需要主動推送某個資源時,便會發送一個 Frame Type 為 PUSH_PROMISE 的 Frame,里面帶了 PUSH 需要新建的 Stream ID。意思是告訴客戶端:接下來我要用這個 ID 向你發送東西,客戶端準備好接著??蛻舳私馕?Frame 時,發現它是一個 PUSH_PROMISE 類型,便會準備接收服務端要推送的流。
參考
- 一次 HTTP 請求就需要一次 TCP 連接嗎?
- 推薦閱讀:深入理解http2.0協議,看這篇就夠了
- https://www.jianshu.com/p/ff8f0bd78942
- https://segmentfault.com/a/1190000011172823
- https://blog.csdn.net/weixin_33693070/article/details/88711831
- https://www.cnblogs.com/shangyueyue/p/11049984.html
- https://www.jianshu.com/p/1ad439279974
- https://blog.csdn.net/u010552788/article/details/80593955
總結
以上是生活随笔為你收集整理的一文理清Http2.0的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM内存结构分析:为什么需要S0和S1
- 下一篇: vps云主机怎么做的(vps怎么搭建云主