雜談:HTTP1.1 與 HTTP2.0 知多少适秩?

HTTP是應(yīng)用層協(xié)議,是基于TCP底層協(xié)議而來(lái)硕舆。

TCP的機(jī)制限定秽荞,每建立一個(gè)連接需要3次握手,斷開(kāi)連接則需要4次揮手抚官。

HTTP協(xié)議采用“請(qǐng)求-應(yīng)答”模式扬跋,HTTP1.0下,HTTP1.1非Keep-Alive模式下凌节,每個(gè)請(qǐng)求都要新建一個(gè)連接钦听,完成之后立即斷開(kāi)連接。如果有新的請(qǐng)求刊咳,則要重新創(chuàng)建請(qǐng)求連接(HTTP協(xié)議為無(wú)連接的協(xié)議)彪见。

這樣不免造成了網(wǎng)絡(luò)傳輸數(shù)據(jù)一定的延遲,1999年推出HTTP1.1娱挨,雖然可以通過(guò)設(shè)置延遲時(shí)間余指,讓連接延遲關(guān)閉。但仍然有線頭阻塞跷坝,max-connection最大連接限制了并行請(qǐng)求數(shù)量等痛點(diǎn)酵镜,難以應(yīng)對(duì)日益增長(zhǎng)的大數(shù)據(jù)實(shí)時(shí)傳輸。

新一代HTTP2.0協(xié)議應(yīng)運(yùn)而生柴钻,提高HTTP應(yīng)對(duì)高并發(fā)場(chǎng)景下的數(shù)據(jù)傳輸能力淮韭。

雜談:HTTP1.1 與 HTTP2.0 知多少?

「 HTTP1.1」

Pipelining管道化

提出管道化方案解決連接延遲贴届,服務(wù)端可設(shè)置Keep-Alive來(lái)讓連接延遲關(guān)閉時(shí)間靠粪,但因?yàn)闉g覽器自身的Max-Connection最大連接限制蜡吧,同一個(gè)域名 (host) 下的請(qǐng)求連接限制(同域下谷歌瀏覽器是一次限制最多6個(gè)連接),只能通過(guò)多開(kāi)域名來(lái)實(shí)現(xiàn)占键,這也就是我們的靜態(tài)資源選擇放到CDN上或其它域名下昔善,來(lái)提高資源加載速度。

pipelining方案需要前后端支持畔乙,但絕大部分的HTTP代理器對(duì)pipelining的支持并不友好君仆。

只支持GET/HEAD

pipelining只支持GET/HEAD方式傳送數(shù)據(jù),不支持POST等其它方式傳輸牲距。

頭部信息冗余

HTTP是無(wú)狀態(tài)的返咱,客戶端/服務(wù)端只能通過(guò)HEAD的數(shù)據(jù)維護(hù)獲取狀態(tài)信息,這樣就造成每次連接請(qǐng)求時(shí)都會(huì)攜帶大量冗余的頭部信息牍鞠,頭部信息包括COOKIE信息等咖摹。

超文本協(xié)議

HTTP1.X是超文本協(xié)議傳輸。超文本協(xié)議傳輸难述,發(fā)送請(qǐng)求時(shí)會(huì)找出數(shù)據(jù)的開(kāi)頭和結(jié)尾幀的位置楞艾,并去除多余空格,選擇最優(yōu)方式傳輸龄广。如果使用了HTTPS,那么還會(huì)對(duì)數(shù)據(jù)進(jìn)行加密處理蕴侧,一定程度上會(huì)造成傳輸速度上的損耗择同。

線頭阻塞

pipelining通過(guò)延遲連接關(guān)閉的方案,雖然可同時(shí)發(fā)起對(duì)服務(wù)端的多個(gè)請(qǐng)求净宵,但服務(wù)端的response依舊遵循FIFO(first in first out)規(guī)則 依次返回敲才。

舉個(gè)例子客戶端發(fā)送了1、2择葡、3紧武、4四個(gè)請(qǐng)求,如果1沒(méi)返回給客戶端敏储,那么2阻星,3,4也不會(huì)返回已添。這就是所謂的線頭阻塞妥箕。高并發(fā)高延遲的場(chǎng)景下阻塞明顯。

HTTP1.X傳輸優(yōu)化方法

  1. 多個(gè)資源合并成一個(gè)請(qǐng)求連接更舞,如前端Spriting雪碧圖畦幢,JS/CSS壓縮成一個(gè)文件等
  2. Inlining內(nèi)聯(lián)的方式,采用inline css/inline js等并入html中缆蝉,減少對(duì)css/js文件的請(qǐng)求
  3. CDN資源多域名轉(zhuǎn)發(fā)宇葱,靜態(tài)資源分布存儲(chǔ)在多個(gè)域下瘦真。

以上三種三種方法雖然能使HTTP1.X協(xié)議傳輸速度提高,但也有對(duì)應(yīng)的不足黍瞧。

  1. 如雪碧圖诸尽,將多個(gè)小圖合并成一張大圖,降低多張小圖請(qǐng)求的高延遲雷逆,但是如果我只想要兩個(gè)icon小圖弦讽,卻需要加載一整張大圖,就會(huì)造成資源冗余膀哲。合并的JS/CSS文件也有類似的問(wèn)題往产。
  2. 內(nèi)聯(lián)的方式,會(huì)讓我們的代碼變得難以維護(hù)某宪,讓html文件變得更大仿村,代碼混合嚴(yán)重。
  3. 多域名下可緩解Max-Connection兴喂,但不同域會(huì)讓Cookie信息無(wú)法彼此共享蔼囊。

了解完HTTP1.1的痛點(diǎn),接下來(lái)就是我們新一代的HTTP協(xié)議HTTP2.0


「 HTTP2.0」

前身SPDY

SPDY是2012年谷歌推出的是基于SSL/TLS的傳輸協(xié)議衣迷,SPDY有降低延遲畏鼓,多路復(fù)用,頭部壓縮壶谒,服務(wù)端推送等特點(diǎn)云矫,這些特點(diǎn)也稱為了后續(xù)HTTP2.0的功能基石,HTTP2.0是SPDY/3 draft的優(yōu)化版汗菜。

HTTP2.0 與 SPDY的區(qū)別:

  1. HTTP2.0 頭部壓縮采用HPACK让禀, 而SPDY采用DELEFT。
  2. HTTP2.0 理論上支持明文HTTP傳輸陨界,而SPDY強(qiáng)制使用HTTPS巡揍。

多路復(fù)用

(一個(gè)域只要一個(gè)TCP連接)實(shí)現(xiàn)真正的并發(fā)請(qǐng)求,降低延時(shí)菌瘪,提高了帶寬的利用率腮敌。

頭部壓縮

客戶端/服務(wù)端進(jìn)行漸進(jìn)更新維護(hù),采用HPACK壓縮麻车,節(jié)省了報(bào)文頭占用流量缀皱。

  1. 相同的頭部信息不會(huì)通過(guò)請(qǐng)求發(fā)送,延用之前請(qǐng)求攜帶的頭部信息动猬。
  2. 新增/修改的頭部信息會(huì)被加入到HEAD中啤斗,兩端漸進(jìn)更新。

兩端會(huì)共同維護(hù)一個(gè)head list赁咙,每次請(qǐng)求時(shí)都會(huì)進(jìn)行檢查钮莲。
該list包括:

  1. static (既定的頭部信息)
  2. dynamic (自定義的頭部信息)

請(qǐng)求優(yōu)先級(jí)

每個(gè)流都有自己的優(yōu)先級(jí)別免钻,客戶端可指定優(yōu)先級(jí)。并可以做流量控制崔拥。因?yàn)镠TTP2.0的傳世允許請(qǐng)求并發(fā)极舔,但是應(yīng)用場(chǎng)景中我們要處理一些主要文件的優(yōu)先級(jí)權(quán)重,以及資源模塊依賴等链瓦。所以我們可通過(guò)設(shè)置優(yōu)先級(jí)來(lái)提高主要文件的權(quán)重拆魏,使其優(yōu)先加載請(qǐng)求。

服務(wù)端推送

請(qǐng)求不是來(lái)自客戶端“明確”的請(qǐng)求慈俯,是從服務(wù)端PUSH_PROMISE幀中提供渤刃。例如我們加載index.html, 我們可能還需要index.js, index.css等文件。傳統(tǒng)的請(qǐng)求只有當(dāng)拿到index.html贴膘,解析html中對(duì)index.js/index.css的引入才會(huì)再請(qǐng)求資源加載卖子,但是通過(guò)服務(wù)端數(shù)據(jù),可以提前將資源推送給客戶端刑峡,這樣客戶端要用到的時(shí)候直接調(diào)用即可洋闽,不用再發(fā)送請(qǐng)求。

  • push的資源能緩存在瀏覽器中
  • 不同的網(wǎng)頁(yè)能使用該緩存突梦,不用重新發(fā)起
  • push的資源通過(guò)multiplexed進(jìn)行傳輸
  • push的資源能夠進(jìn)行priority標(biāo)識(shí)
  • client有權(quán)取消push資源的加載
  • push的資源必須同域

二進(jìn)制協(xié)議

HTTP2.0 傳輸協(xié)議采用二進(jìn)制協(xié)議诫舅,區(qū)別與HTTP1.X的超文本協(xié)議。更易于幀宫患,數(shù)據(jù)包的發(fā)送接收骚勘。HTTP2.0是運(yùn)行在TCP連接上的應(yīng)用層協(xié)議,接受服務(wù)器或發(fā)送請(qǐng)求時(shí)撮奏,會(huì)自動(dòng)將頭部信息/request body分成HEAD幀和DATA幀。

客戶端/服務(wù)端發(fā)送/接收數(shù)據(jù)時(shí)当宴,會(huì)將數(shù)據(jù)打散亂序發(fā)送畜吊,接收數(shù)據(jù)時(shí)接收一端再通過(guò)streamID標(biāo)識(shí)來(lái)將數(shù)據(jù)合并。

HTTP2.0環(huán)境要求

HTTP2.0理論上支持明文HTTP傳輸户矢,但因?yàn)槠淝吧鞸PDY是在TLS上玲献,他們的主人Google 和 Firefox 都支持TLS架構(gòu),所以需要搭建HTTP2.0 + TLS成了標(biāo)準(zhǔn)梯浪。

  1. Nginx > 1.10
  2. OpenSSL > 1.0.2
  3. CA證書(shū)

參考文檔

作者:以樂(lè)之名
本文原創(chuàng)捌年,有不當(dāng)?shù)牡胤綒g迎指出。轉(zhuǎn)載請(qǐng)指明出處挂洛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末礼预,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子虏劲,更是在濱河造成了極大的恐慌托酸,老刑警劉巖褒颈,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異励堡,居然都是意外死亡谷丸,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門应结,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)刨疼,“玉大人,你說(shuō)我怎么就攤上這事鹅龄】剑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵砾层,是天一觀的道長(zhǎng)漩绵。 經(jīng)常有香客問(wèn)我,道長(zhǎng)肛炮,這世上最難降的妖魔是什么止吐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮侨糟,結(jié)果婚禮上碍扔,老公的妹妹穿的比我還像新娘。我一直安慰自己秕重,他們只是感情好不同,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著溶耘,像睡著了一般二拐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凳兵,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天百新,我揣著相機(jī)與錄音,去河邊找鬼庐扫。 笑死饭望,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的形庭。 我是一名探鬼主播铅辞,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼萨醒!你這毒婦竟也來(lái)了斟珊?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤富纸,失蹤者是張志新(化名)和其女友劉穎倍宾,沒(méi)想到半個(gè)月后雏节,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡高职,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年钩乍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怔锌。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寥粹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出埃元,到底是詐尸還是另有隱情涝涤,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布岛杀,位于F島的核電站阔拳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏类嗤。R本人自食惡果不足惜糊肠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望遗锣。 院中可真熱鬧货裹,春花似錦、人聲如沸精偿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)笔咽。三九已至搔预,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叶组,已是汗流浹背斯撮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扶叉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓帕膜,卻偏偏與公主長(zhǎng)得像枣氧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子垮刹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容