Http1.0
Http1.0是一種無(wú)狀態(tài)厨相、無(wú)連接的應(yīng)用層協(xié)議领曼。
HTTP1.0規(guī)定瀏覽器和服務(wù)器保持短暫的連接鸥鹉,瀏覽器的每次請(qǐng)求都需要與服務(wù)器建立一個(gè)TCP連接,服務(wù)器處理完成后立即斷開(kāi)TCP連接(無(wú)連接)悯森,服務(wù)器不跟蹤每個(gè)客戶端也不記錄過(guò)去的請(qǐng)求(無(wú)狀態(tài))宋舷。
Http1.0的導(dǎo)致的問(wèn)題
- 無(wú)復(fù)用連接
每發(fā)送一次網(wǎng)絡(luò)請(qǐng)求都要進(jìn)行一次TCP連接;而TCP得連接和釋放又比較耗費(fèi)時(shí)間(每次都需要三次握手和四次揮手)瓢姻;這種無(wú)連接的特性會(huì)使得網(wǎng)絡(luò)的利用率非常低祝蝠。
- 隊(duì)頭阻塞
HTTP1.0規(guī)定下一個(gè)請(qǐng)求必須在前一個(gè)請(qǐng)求響應(yīng)到達(dá)之后才能發(fā)送。假設(shè)前一個(gè)請(qǐng)求響應(yīng)一直不到達(dá)幻碱,那么下一個(gè)請(qǐng)求就不發(fā)送绎狭,同樣的后面的請(qǐng)求也給阻塞了。
Http1.1
為了解決Http1.0的一些問(wèn)題褥傍,Http1.1出現(xiàn)了儡嘶;
對(duì)于 HTTP/1.1,不僅繼承了 HTTP1.0簡(jiǎn)單的特點(diǎn)恍风,還克服了諸多 HTTP1.0性能上的問(wèn)題蹦狂。
Http1.1的新增特點(diǎn)
- 持久化連接
通過(guò)設(shè)置 Connection:keep-alive 來(lái)實(shí)現(xiàn)持久化連接(長(zhǎng)連接),即多個(gè)請(qǐng)求和響應(yīng)可以利用同一個(gè) TCP 連接朋贬,而不是每一次請(qǐng)求響應(yīng)都要新建一個(gè)TCP連接凯楔。 - 增加管道機(jī)制
管道化使得請(qǐng)求能夠“并行”傳輸。而‘響應(yīng)’依舊是一個(gè)一個(gè)返回锦募。并沒(méi)有真正意義上的解決隊(duì)頭阻塞問(wèn)題摆屯;
但是,當(dāng)出現(xiàn)隊(duì)頭阻塞時(shí)糠亩,瀏覽器會(huì)建立多個(gè)TCP連接虐骑;
分塊傳輸
在 HTTP/1.1 版本中,可以不必等待數(shù)據(jù)完全處理完畢再返回赎线,服務(wù)器產(chǎn)生部分?jǐn)?shù)據(jù)廷没,那么就發(fā)送部分?jǐn)?shù)據(jù),很明此種方式更加優(yōu)秀一些垂寥,可以節(jié)省很多等待時(shí)間腕柜。增加 host 字段
使得一個(gè)服務(wù)器能夠用來(lái)創(chuàng)建多個(gè) Web 站點(diǎn)。錯(cuò)誤提示
HTTP/1.1 引入了一個(gè) Warning 頭域矫废,增加對(duì)錯(cuò)誤或警告信息的描述,此外砰蠢,在 HTTP/1.1 中新增了24個(gè)狀態(tài)響應(yīng)碼(100蓖扑,101,203台舱,205律杠,206潭流,301,305… )柜去。帶寬優(yōu)化
HTTP1.1支持只發(fā)送header信息(不帶任何body信息)灰嫉,如果服務(wù)器認(rèn)為客戶端有權(quán)限請(qǐng)求服務(wù)器,則返回100嗓奢,客戶端接收到100才開(kāi)始把請(qǐng)求body發(fā)送到服務(wù)器讼撒;如果返回401,客戶端就可以不用發(fā)送請(qǐng)求body了節(jié)約了帶寬股耽。緩存處理
HTTP1.1
還加入了緩存處理(強(qiáng)緩存和協(xié)商緩存[傳送門(mén)])新的字段如cache-control
Http2.0
HTTP 2.0的目標(biāo):改進(jìn)傳輸性能
HTTP 2.0 的主要目標(biāo)是改進(jìn)傳輸性能根盒,實(shí)現(xiàn)低延遲和高吞吐量。從另一方面看物蝙,HTTP 的高層協(xié)議語(yǔ)義并不會(huì)因?yàn)檫@次版本升級(jí)而受影響炎滞。所有HTTP 首部、值诬乞,以及它們的使用場(chǎng)景都不會(huì)變册赛。
Http2.0新增特點(diǎn)
1. 多路復(fù)用(連接共享)
多路復(fù)用的一些概念:
- 流(stream):已建立連接上的雙向字節(jié)流。
- 消息:與邏輯消息對(duì)應(yīng)的完整的一系列數(shù)據(jù)幀震嫉。
- 幀(frame):HTTP2.0通信的最小單位森瘪,每個(gè)幀包含幀頭部,至少也會(huì)標(biāo)識(shí)出當(dāng)前幀所屬的流(stream id)责掏。
一次Http請(qǐng)求響應(yīng)對(duì)應(yīng)會(huì)建立一個(gè)雙向字節(jié)流柜砾;每一流有自己的 Stream ID
每個(gè)數(shù)據(jù)流以消息的形式發(fā)送,而消息由一或多個(gè)幀組成换衬。這些幀可以亂序發(fā)送痰驱,然后再根據(jù)每個(gè)幀頭部的流標(biāo)識(shí)符(stream id)重新組裝。
所有的HTTP2.0通信都在一個(gè)TCP連接上完成瞳浦,這個(gè)連接可以承載任意數(shù)量的雙向數(shù)據(jù)流担映。
另外,多路復(fù)用(連接共享)可能會(huì)導(dǎo)致關(guān)鍵請(qǐng)求被阻塞叫潦。HTTP2.0里每個(gè)數(shù)據(jù)流都可以設(shè)置優(yōu)先級(jí)和依賴蝇完,優(yōu)先級(jí)高的數(shù)據(jù)流會(huì)被服務(wù)器優(yōu)先處理和返回給客戶端,數(shù)據(jù)流還可以依賴其他的子數(shù)據(jù)流矗蕊。
2. 頭部壓縮
HTTP1.1 不支持 header 數(shù)據(jù)的壓縮短蜕,HTTP/2.0 使用 HPACK 算法對(duì) header 的數(shù)據(jù)進(jìn)行壓縮,這樣數(shù)據(jù)體積小了傻咖,在網(wǎng)絡(luò)上傳輸就會(huì)更快朋魔。高效的壓縮算法可以很大的壓縮 header ,減少發(fā)送包的數(shù)量從而降低延遲卿操。
3. 服務(wù)器推送
在 HTTP/2 中警检,服務(wù)器可以對(duì)客戶端的一個(gè)請(qǐng)求發(fā)送多個(gè)響應(yīng)孙援,即服務(wù)器可以額外的向客戶端推送資源,而無(wú)需客戶端明確的請(qǐng)求扇雕。
總結(jié)
HTTP1.1
- 持久連接
- 請(qǐng)求管道化
- 增加緩存處理(新的字段如cache-control)
- 增加Host字段拓售、支持?jǐn)帱c(diǎn)傳輸?shù)?/li>
HTTP2.0
- 多路復(fù)用(或連接共享)(基于二進(jìn)制分幀)
- 頭部壓縮
- 服務(wù)器推送