關(guān)注「松寶寫代碼」籽御,精選好文练慕,每日一題
作者: saucxs
愿努力拼搏的你,都能在前進的道路上有所收獲技掏!
一铃将、前言
HTTP 2.0 相比于 HTTP 1.X,可以說是大幅度提高了 web 的性能零截。
在 HTTP 1.X 中麸塞,為了性能考慮,我們會引入雪碧圖涧衙、將小圖內(nèi)聯(lián)、使用多個域名等等的方式奥此。這一切都是因為瀏覽器限制了同一個域名下的請求數(shù)量弧哎,當(dāng)頁面中需要請求很多資源的時候,隊頭阻塞(Head of line blocking)會導(dǎo)致在達到最大請求數(shù)量時稚虎,剩余的資源需要等待其他資源請求完成后才能發(fā)起請求撤嫩。
二、HTTP 2.0
感受下 HTTP 2.0 比 HTTP 1.X 到底快了多少蠢终,地址:https://http2.akamai.com/demo
在 HTTP 1.X 中序攘,因為隊頭阻塞的原因茴她,你會發(fā)現(xiàn)請求是這樣的
在 HTTP 2.0 中,因為引入了多路復(fù)用程奠,你會發(fā)現(xiàn)請求是這樣的
三丈牢、HTTP 2.0核心
3.1 二進制傳輸
HTTP 2.0中所有加強性能的核心帶你在于此--二進制傳輸。
之前的HTTP的版本中瞄沙,我們傳輸數(shù)據(jù)方式--文本傳輸己沛。
在HTTP 2.0中引入了新的編碼機制,所有傳輸?shù)臄?shù)據(jù)都會被分隔距境,并采用二級制格式編碼申尼。
3.2 多路復(fù)用
在 HTTP 2.0 中,有兩個非常重要的概念垫桂,分別是幀(frame)和流(stream)师幕。
幀代表著最小的數(shù)據(jù)單位,每個幀會標(biāo)識出該幀屬于哪個流诬滩,流也就是多個幀組成的數(shù)據(jù)流霹粥。
多路復(fù)用,就是在一個 TCP 連接中可以存在多條流碱呼。換句話說蒙挑,也就是可以發(fā)送多個請求,對端可以通過幀中的標(biāo)識知道屬于哪個請求愚臀。通過這個技術(shù)忆蚀,可以避免 HTTP 舊版本中的隊頭阻塞問題,極大的提高傳輸性能姑裂。
3.3 Header壓縮
在 HTTP 1.X 中馋袜,我們使用文本的形式傳輸 header,在 header 攜帶 cookie 的情況下舶斧,可能每次都需要重復(fù)傳輸幾百到幾千的字節(jié)欣鳖。
在 HTTP 2.0 中,使用了 HPACK 壓縮格式對傳輸?shù)?header 進行編碼茴厉,減少了 header 的大小泽台。并在兩端維護了索引表,用于記錄出現(xiàn)過的 header 矾缓,后面在傳輸過程中就可以傳輸已經(jīng)記錄過的 header 的鍵名怀酷,對端收到數(shù)據(jù)后就可以通過鍵名找到對應(yīng)的值。
3.4 服務(wù)端push
在 HTTP 2.0 中嗜闻,服務(wù)端可以在客戶端某個請求后蜕依,主動推送其他資源。
可以想象以下情況,某些資源客戶端是一定會請求的样眠,這時就可以采取服務(wù)端 push 的技術(shù)友瘤,提前給客戶端推送必要的資源,這樣就可以相對減少一點延遲時間檐束。當(dāng)然在瀏覽器兼容的情況下你也可以使用 prefetch 辫秧。
3.5 QUIC
這是一個谷歌出品的基于 UDP 實現(xiàn)的同為傳輸層的協(xié)議,目標(biāo)很遠(yuǎn)大厢塘,希望替代 TCP 協(xié)議茶没。
1、該協(xié)議支持多路復(fù)用晚碾,雖然 HTTP 2.0 也支持多路復(fù)用抓半,但是下層仍是 TCP,因為 TCP 的重傳機制格嘁,只要一個包丟失就得判斷丟失包并且重傳笛求,導(dǎo)致發(fā)生隊頭阻塞的問題,但是 UDP 沒有這個機制
2糕簿、實現(xiàn)了自己的加密協(xié)議探入,通過類似 TCP 的 TFO 機制可以實現(xiàn) 0-RTT,當(dāng)然 TLS 1.3 已經(jīng)實現(xiàn)了 0-RTT 了
3懂诗、支持重傳和糾錯機制(向前恢復(fù))蜂嗽,在只丟失一個包的情況下不需要重傳,使用糾錯機制恢復(fù)丟失的包殃恒。糾錯機制:通過異或的方式植旧,算出發(fā)出去的數(shù)據(jù)的異或值并單獨發(fā)出一個包,服務(wù)端在發(fā)現(xiàn)有一個包丟失的情況下离唐,通過其他數(shù)據(jù)包和異或值包算出丟失包病附。在丟失兩個包或以上的情況就使用重傳機制,因為算不出來了亥鬓。
往期「每日一題」
1完沪、JavaScript && ES6
第 41 題:【每日一題】(41題)JS代碼到底是如何被壓縮的?
第 28 題:【每日一題】(28題)面試官:原型鏈與構(gòu)造函數(shù)結(jié)合方法繼承與原型式繼承的區(qū)別熟呛?
第 16 題:【每日一題】面試官問:JS中如何全面進行客戶端檢測昔逗?
第 15 題:【每日一題】面試官問:JS類型判斷有哪幾種方法降传?
第 13 題[每日一題]面試官問:['1', '2', '3'].map(parseInt)輸出,原因勾怒,以及延伸婆排?
2赞枕、瀏覽器
3坪创、Vue
4、React
5柠掂、HTML5
6依沮、算法
第 26 道【每日一題】(26題)算法題:最長公共前綴列粪?
7态蒂、Node
8费什、Http
謝謝支持
1、文章喜歡的話可以「分享,點贊瘩蚪,在看」三連哦泉懦。
2、作者昵稱:saucxs疹瘦,songEagle崩哩,松寶寫代碼⊙糟澹「松寶寫代碼」公眾號作者邓嘹,每日一題,實驗室等险胰。一個愛好折騰汹押,致力于全棧,正在努力成長的字節(jié)跳動工程師鸯乃,星辰大海鲸阻,未來可期。內(nèi)推字節(jié)跳動各個部門各個崗位缨睡。
3鸟悴、長按下面圖片,關(guān)注「松寶寫代碼」奖年,是獲取開發(fā)知識體系構(gòu)建细诸,精選文章,項目實戰(zhàn)陋守,實驗室震贵,每日一道面試題,進階學(xué)習(xí)水评,思考職業(yè)發(fā)展猩系,涉及到JavaScript,Node中燥,Vue寇甸,React,瀏覽器疗涉,http拿霉,算法,端相關(guān)咱扣,小程序等領(lǐng)域绽淘,希望可以幫助到你,我們一起成長