HTTP 2.0最大的特色: 不會改動HTTP 的語義,HTTP 方法、狀態碼、URI 及首部字段,等等這些核心概念上一如往常,卻能致力於突破上一代標準的性能限制,改進傳輸性能,實現低延遲和高吞吐量。而之因此叫2.0,是在於新增的二進制分幀層。
html
既然又要保證HTTP的各類動詞,方法,首部都不受影響,那就須要在應用層(HTTP2.0)和傳輸層(TCP or UDP)之間增長一個二進制分幀層。緩存
在二進制分幀層上,HTTP 2.0 會將全部傳輸的信息分割爲更小的消息和幀,並對它們採用二進制格式的編碼 ,其中HTTP1.x的首部信息會被封裝到Headers幀,而咱們的request body則封裝到Data幀裏面。服務器
而後,HTTP 2.0 通訊都在一個鏈接上完成,這個鏈接能夠承載任意數量的雙向數據流。相應地,每一個數據流以消息的形式發送,而消息由一或多個幀組成,這些幀能夠亂序發送,而後再根據每一個幀首部的流標識符從新組裝。網絡
HTTP 2.0 在客戶端和服務器端使用「首部表」來跟蹤和存儲以前發送的鍵-值對,對於相同的數據,再也不經過每次請求和響應發送;通訊期間幾乎不會改變的通用鍵-值對(用戶代理、可接受的媒體類型,等等)只 需發送一次。事實上,若是請求中不包含首部(例如對同一資源的輪詢請求),那麼 首部開銷就是零字節。此時全部首部都自動使用以前請求發送的首部。性能
若是首部發生變化了,那麼只須要發送變化了數據在Headers幀裏面,新增或修改的首部幀會被追加到「首部表」。首部表在 HTTP 2.0 的鏈接存續期內始終存在,由客戶端和服務器共同漸進地更新 。優化
HTTP2.0全部通訊都是在一個TCP鏈接上完成。HTTP 2.0 把 HTTP 協議通訊的基本單位縮小爲一個一個的幀,這些幀對應 着邏輯流中的消息。並行地在同一個 TCP 鏈接上雙向交換消息。就比如,我請求一個頁面http://www.qq.com。頁面上全部的資源請求都是客戶端與服務器上的一條TCP上請求和響應的!編碼
有關注TCP性能的同窗就會知道,HTTP性能的關鍵在於低延遲而不是高帶寬!大多數HTTP 鏈接的時間都很短,並且是突發性的,但TCP 只在長時間鏈接傳輸大塊數據時效率才最高。HTTP 2.0 經過讓全部數據流共用同一個鏈接,能夠更有效地使用TCP 鏈接,讓高帶寬也能真正的服務於HTTP的性能提高。代理
同時,單連接多資源的方式,使到至上而下的層面都獲得了好處:htm
1.能夠減小服務連接壓力,內存佔用少了,鏈接吞吐量大了內存
2.因爲 TCP 鏈接減小而使網絡擁塞情況得以改觀;
3.慢啓動時間減小,擁塞和丟包恢復速度更快。
也就是說,「資源合併減小請求」的優化手段對於HTTP2.0來講是沒有效果的,只會增大無用的工做量而已。
在HTTP2.0上,客戶端和服務器能夠把HTTP 消息分解爲互不依賴的幀,而後亂序發送,最後再在另外一端把它們從新組合起來。注意,同一連接上有多個不一樣方向的數據流在傳輸。客戶端能夠一邊亂序發送stream,也能夠一邊接收者服務器的響應,而服務器那端同理。
把 HTTP 消息分解爲獨立的幀,交錯發送,而後在另外一端從新組裝是 HTTP 2.0 最 重要的一項加強。事實上,這個機制會在整個 Web 技術棧中引起一系列連鎖反應, 從而帶來巨大的性能提高,由於:
能夠並行交錯地發送請求,請求之間互不影響;
能夠並行交錯地發送響應,響應之間互不干擾;
只使用一個鏈接便可並行發送多個請求和響應;
消除沒必要要的延遲,從而減小頁面加載的時間;
那麼也就是說「域名分區」這種優化手段對於HTTP2.0是無用的,由於資源都是並行交錯發送,且沒有限制,不須要額外的多域名並行下載。
每一個HTTP2.0流裏面有個優先值,這個優先值肯定着客戶端和服務器處理不一樣的流採起不一樣的優先級策略,高優先級的流都應該優先發送,但又不會絕對的。絕對地準守,可能又會引入首隊阻塞的問題:高優先級的請求慢致使阻塞其餘資源交付。分配處理資源和客戶端與服務器間的帶寬,不一樣優先級的混合也是必須的。
HTTP 2.0 新增的一個強大的新功能,就是服務器能夠對一個客戶端請求發送多個響應。換句話說,除了對最初請求的響應外,服務器還能夠額外向客戶端推送資源,而無需客戶端明確地請求。
有了HTTP2.0的服務器推送,HTTP1.x時代的內嵌資源的優化手段也變得沒有意義了。並且使用服務器推送的資源的方式更加高效,由於客戶端還能夠緩存起來,甚至能夠由不一樣的頁面共享(依舊遵循同源策略)。