文章出處
文章列表
今早在公交車上,把http2的官方講解文檔(還在草案之中)看了一圈,發現相對http 1.1確實改進了不少,完整的文檔可通過:://www.gitbook.com/book/ye11ow/http2-explained/details 下載
把其中的主要思路結合我個人的理解,記錄在這里(初次接觸,可能有理解不正確的地方,如有不妥,歡迎指正)
1、 多路復用
下面這二張圖很形象,http2中發送數據是基于幀的,每個幀又對應著一個“流“,下面這二列火車好比二個流,傳統方式下,要傳輸二個流,有可能要發送二次數據(或者創建2個連接)。

在http2里,這二個流,可以串在一起,類似下圖,這樣發送一次就行了,即實現了所謂的多路復用,這樣帶來的直接好處是:不需要創建太多的TCP連接(創建TCP連接代價很高的),能省下不少的連接資源。

2、流的優先級和依賴性
每個流可以指派流的優先級(這個過程可以是動態的),比如在頁面上切換tab頁時,可以把將要顯示的的圖片對應的流,優先級增加,以加快顯示,改善用戶體驗,另外每個流依賴其它哪些流,也可以指定。
3、頭壓縮
一張網頁的加載過程中,可能會很多的http請求,每個請求中,都會包含一些重復的頭信息(比如:cookie信息),十分浪費,http2可以將這些重復的內容壓縮,提升性能。
4、服務器推送
這其實是服務端的一個智能預測,比如瀏覽器在加載資源X時,服務器如果知道瀏覽器很可能也會需要資源Y,那么服務器可以主動把資源Y推送給瀏覽器緩存起來,這樣以后要用資源Y的時候,用戶感覺就會很快。
5、備選服務
在負載均衡的情況下,會有多個server在提供服務,但是一個TCP連接總歸只能連接到一個Server,在http2下長連接估計會成為趨勢,這樣的話,不利于負載"均衡"的整體性能發揮,如果服務端想建議客戶端連接到另一個節點,可以用Alt-Svc頭來告訴客戶端有另一個備選服務器
上述這一堆改進最終的目的,我個人理解就是一句話:“更少的TCP連接,更快的傳輸”,如果http2流行以后,傳統的一些優化手段,比如css sprit,把多個小js文件合并成一個文件這些技巧就沒必要了,因為“多路復用”,本身就能把多個小文件串在一起,在同一個幀中發送,而不至于增加TCP連接。
潛在的副作用:
1、目前只支持TLS,即只能通過https:// 安全連接,這會帶來額外的開銷。
2、內容是二進制的,看起來不如以前直觀,調試起來不如http 1.1方便
目前的支持情況:
1、瀏覽器方面,Firefox、Chrome最新版本已經實現了http 2,其它瀏覽器比如:Safari,IE,Opera宣稱也會跟進,所以瀏覽器方面的普及應該不是什么大問題
2、服務器方面,目前只有H2o支持了,Apache,Nginx目前還沒有跟上。
另外,值得一提是Google的開源項目gRPC,就是在 protobuf + http2 實現的RPC框架。
最后,http 2被設計為與http 1.1完全兼容(沒辦法,現在還是 http 1.1的天下,如果不兼容,估計沒人愿意嘗試),所以我個人覺得這應該是一個過渡的協議,仍然背負著一些http 1.1的歷史包袱,等流行之后,應該在http 3里會做一些激進的改進,就象html 4到html 5的飛躍一樣。
文章列表
全站熱搜