為何會有http/2 ? 它要改善甚麼 ?
http/2標準發布於2015年5月,其主要目的是透過一些措施改善瀏覽器瀏覽網頁加載的速度(page load)。目前大多數的瀏覽器已支援 http/2 (chrome, firefox, safari等)標準,又 http/2與 http/1.1有著高度的相容信,舉凡request method(post, get..etc), http status code, url, header 等等,因此對於web developer來說,只需要確保你的網站有支援https(因為瀏覽器只支援https 在http/2上)。那麼http/1.1與http/2到底相差多快呢,下列有幾個網站可以比較其差異,可以自行體驗!
http/2 是如何改善 ?
Request and response multiplexing (多路複用)
在http/1.1中,client端時常會同時發起多個request至server拿取檔案(像是js, css, image等),以此方式達到快速載入頁面。如下圖在http/1.1中會同時與server建立3個TCP connection,但是瀏覽器通常會限制TCP connection同時建立的數目。因此在http/2協定中,允許client端與同一server建立單一TCP connection並以非同步方式傳輸要的檔案。
Header compression (標頭壓縮)
每一個http的傳輸中都會攜帶一組header,在http/1.1中,header會是以明文(plain text)傳輸大小通常會是500-800 bytes,若有攜帶cookie也有可能會更大。因此在http/2中,會將request以及response的header使用HPACK演算法壓縮header的內容,此方法壓縮後可以減少85%-88%的大小。
Server push (伺服器推送)
在http/1.1中,通常client端request甚麼server就會回傳甚麼,例如: 當client request html那麼server將只會回傳html。但在http/2中,允許server主動推送有相關的資料給client,例如: 當client只request html,但是server知道client request此html後續也會request css, js等,因此server就會在client沒有request的情況下主動推送css, js檔給client。那server怎麼知道這些檔案是有相關性的呢? web developer將需要server push的檔案加上特定的描述即可。(描述)
Binary framing layer (二進制影格層)
在http/2中,header與body所挾帶的property與http/1.1相同(ex. verbs, methods),然而兩者在傳輸上會有不同。在http/2中,會將header以及body編碼成二進制在server 與client端中傳輸,在http/1.1中,則是以明文的方式傳輸。將訊息編碼成二進制進行傳輸,此特性是http/2 的其他特性的根本基礎。
總結
根據w3Techs網站,目前使用http/2的網站有45.7%,未來確實會變成主流,身為軟體工程師,還是多少理解來的好。此篇文章僅記錄筆者蒐集資料彙整結果,若有任何錯誤資訊還請直接點出,萬分感謝。
reference:
https://developers.google.com/web/fundamentals/performance/http2