在詳細(xì)分析http2.0之前乍迄,有必要先看看http協(xié)議的演進(jìn)史,是如何一步一步從http1.0升級(jí)到http2.0的:
Http1.0
在仔細(xì)的分析http1.0, http1.1, http2.0的區(qū)別之前,我對(duì)http協(xié)議的理解停留在http1.0的水平:
請(qǐng)求頭部:
Connected to xxx.xx.xxx.xxx
Get xxx Http/1.0
User-AgentL xxxxx
Accept: /
請(qǐng)求響應(yīng):
HTTP/1.0 200 OK
Content-Type: text/plain
Content-Length: 23322
Expires: xxx
Last-modified: xxx
Server: xxx
請(qǐng)求頭部和響應(yīng)頭部都是純文本的唉锌,請(qǐng)求注明了資源路徑试读,并攜帶UA和cookie信息,而響應(yīng)也指明了協(xié)議類型罗珍,狀態(tài)碼洽腺,內(nèi)容長(zhǎng)度,緩存有效時(shí)間/上一次修改時(shí)間等用于瀏覽器檢測(cè)資源緩存有效性的字段覆旱。每個(gè)資源請(qǐng)求都需要建立TCP連接蘸朋,哪怕是向同一臺(tái)服務(wù)器請(qǐng)求。此外扣唱,整個(gè)協(xié)議還存在其他瑕疵藕坯,因此6個(gè)月之后就制定了Http1.1的標(biāo)準(zhǔn)团南。
Http1.1
相對(duì)于1.0版,1.1版主要在以下幾方面進(jìn)行了改進(jìn):
- 持久連接炼彪⊥赂客戶端在連接同一個(gè)主機(jī)并發(fā)送多個(gè)請(qǐng)求時(shí),不再每次都中斷連接辐马,而是可以持續(xù)的保持連接拷橘,直到所有請(qǐng)求結(jié)束,這種機(jī)制也反推動(dòng)http1.0來增加connection:keep-alive頭部來實(shí)現(xiàn)相同效果喜爷。據(jù)統(tǒng)計(jì)冗疮,平均每個(gè)頁(yè)面大概90個(gè)請(qǐng)求,那么假設(shè)資源都處于同一個(gè)域名檩帐,而為了防止過渡占用資源术幔,同一個(gè)客戶端最多同時(shí)向同一臺(tái)主機(jī)請(qǐng)求6個(gè)資源,因此在前端開發(fā)中湃密,往往通過資源合并诅挑,內(nèi)嵌等方式來減少請(qǐng)求個(gè)數(shù),此外資源預(yù)取泛源,頁(yè)面預(yù)渲染等方式也成為了常用優(yōu)化手段拔妥。通過HTTP管道,域名分區(qū)可以增加文件下載的并行度达箍。
- Host域毒嫡。主要適用與同一臺(tái)物理機(jī)器需要適配多個(gè)域名的情形,有了HOST域則能正確的將請(qǐng)求分發(fā)給對(duì)應(yīng)的業(yè)務(wù)幻梯。
3.緩存兜畸。Http1.0使用max-age和expires來設(shè)定資源有效時(shí)間,當(dāng)超過時(shí)間時(shí)碘梢,需要通過If-Modified-Since來詢問服務(wù)器資源是否仍然有效咬摇,然而這種絕對(duì)時(shí)間會(huì)造成不同機(jī)器的時(shí)鐘同步問題。Http1.1通過增加Etag來標(biāo)識(shí)文件可以解決時(shí)鐘同步問題煞躬。 - 內(nèi)容協(xié)商機(jī)制肛鹏,比如accept-language, accept-charset等等。
- 新增了很多狀態(tài)碼恩沛,比如206 斷點(diǎn)續(xù)傳等在扰。
Http2.0
看起來Http1.1已經(jīng)很完美了,不過Http2.0則進(jìn)一步完善了1.1的功能雷客,主要表現(xiàn)在
- 壓縮芒珠。2.0把數(shù)據(jù)交互劃分為流,消息和幀搅裙,幀成為了數(shù)據(jù)交互的最小單位皱卓,同一個(gè)請(qǐng)求的頭部和數(shù)據(jù)部分可以分離開來形成不同的幀裹芝,客戶端再對(duì)幀進(jìn)行組裝。并且娜汁,二進(jìn)制編碼對(duì)收不數(shù)據(jù)進(jìn)行了壓縮嫂易,減少了消息體大小。如此一來掐禁,客戶端和服務(wù)端都可以以幀的形式怜械,互不干擾的同時(shí)發(fā)出多個(gè)請(qǐng)求或者響應(yīng),而這種發(fā)送是亂序的傅事,不再會(huì)因?yàn)橹暗臄?shù)據(jù)包未收到而等待中間數(shù)據(jù)包的情形宫盔。
- 服務(wù)器推送。當(dāng)連接建立以后享完,服務(wù)器可以主動(dòng)向客戶端推送信息,這種推送避免了之前需要不斷的輪詢服務(wù)器來獲取狀態(tài)是否變更的情形有额,
- 減少連接般又。每個(gè)來源只需要建立一個(gè)tcp連接,不再需要像1.1一樣巍佑,同時(shí)開啟多個(gè)進(jìn)程來實(shí)現(xiàn)并行下載茴迁,以及為了繞開最多同時(shí)下載6個(gè)資源而使用域名分區(qū)。
就先聊到這里把萤衰,隨著HTTP協(xié)議的不斷演進(jìn)堕义,有沒有發(fā)現(xiàn)生活在不斷的變得更美好了呢!