HTTP協(xié)議是如今互聯(lián)網(wǎng)與服務(wù)端技術(shù)的基石岖常,HTTP協(xié)議的演進(jìn)也從側(cè)面反應(yīng)了互聯(lián)網(wǎng)技術(shù)的快速發(fā)展驯镊。這兩天在準(zhǔn)備一次關(guān)于HTTP1.1協(xié)議特性的技術(shù)分享過(guò)程中,順 便了解了下各版本HTTP協(xié)議的特點(diǎn)竭鞍,在這里做個(gè)簡(jiǎn)單的總結(jié)板惑。
HTTP協(xié)議到現(xiàn)在為止總共經(jīng)歷了3個(gè)版本的演化,第一個(gè)HTTP協(xié)議誕生于1989年3月偎快。
1冯乘、HTTP 0.9
HTTP 0.9是第一個(gè)版本的HTTP協(xié)議,已過(guò)時(shí)晒夹。它的組成極其簡(jiǎn)單裆馒,只允許客戶(hù)端發(fā)送GET這一種請(qǐng)求,且不支持請(qǐng)求頭丐怯。由于沒(méi)有協(xié)議頭喷好,造成了HTTP 0.9協(xié)議只支持一種內(nèi)容,即純文本读跷。不過(guò)網(wǎng)頁(yè)仍然支持用HTML語(yǔ)言格式化梗搅,同時(shí)無(wú)法插入圖片。
HTTP 0.9具有典型的無(wú)狀態(tài)性效览,每個(gè)事務(wù)獨(dú)立進(jìn)行處理无切,事務(wù)結(jié)束時(shí)就釋放這個(gè)連接。由此可見(jiàn)钦铺,HTTP協(xié)議的無(wú)狀態(tài)特點(diǎn)在其第一個(gè)版本0.9中已經(jīng)成型订雾。一次HTTP 0.9的傳輸首先要建立一個(gè)由客戶(hù)端到Web服務(wù)器的TCP連接,由客戶(hù)端發(fā)起一個(gè)請(qǐng)求矛洞,然后由Web服務(wù)器返回頁(yè)面內(nèi)容洼哎,然后連接會(huì)關(guān)閉烫映。如果請(qǐng)求的頁(yè)面不存在,也不會(huì)返回任何錯(cuò)誤碼噩峦。
2锭沟、HTTP 1.0
HTTP協(xié)議的第二個(gè)版本,第一個(gè)在通訊中指定版本號(hào)的HTTP協(xié)議版本识补,至今仍被廣泛采用族淮。相對(duì)于HTTP 0.9 增加了如下主要特性:
請(qǐng)求與響應(yīng)支持頭域
響應(yīng)對(duì)象以一個(gè)響應(yīng)狀態(tài)行開(kāi)始
響應(yīng)對(duì)象不只限于超文本
開(kāi)始支持客戶(hù)端通過(guò)POST方法向Web服務(wù)器提交數(shù)據(jù),支持GET凭涂、HEAD祝辣、POST方法
(短連接)每一個(gè)請(qǐng)求建立一個(gè)TCP連接,請(qǐng)求完成后立馬斷開(kāi)連接切油。這將會(huì)導(dǎo)致2個(gè)問(wèn)題:連接無(wú)法復(fù)用蝙斜,head of line blocking。連接無(wú)法復(fù)用會(huì)導(dǎo)致每次請(qǐng)求都經(jīng)歷三次握手和慢啟動(dòng)澎胡。三次握手在高延遲的場(chǎng)景下影響較明顯孕荠,慢啟動(dòng)則對(duì)文件類(lèi)請(qǐng)求影響較大。head of line blocking會(huì)導(dǎo)致帶寬無(wú)法被充分利用攻谁,以及后續(xù)健康請(qǐng)求被阻塞稚伍。
3、HTTP 1.1
HTTP協(xié)議的第三個(gè)版本是HTTP 1.1戚宦,是目前使用最廣泛的協(xié)議版本 个曙。HTTP 1.1是目前主流的HTTP協(xié)議版本,因此這里就多花一些筆墨介紹一下HTTP 1.1的特性阁苞。
HTTP 1.1引入了許多關(guān)鍵性能優(yōu)化:keepalive連接困檩,chunked編碼傳輸,字節(jié)范圍請(qǐng)求那槽,請(qǐng)求流水線等
Persistent Connection(keepalive連接):允許HTTP設(shè)備在事務(wù)處理結(jié)束之后將TCP連接保持在打開(kāi)的狀態(tài)悼沿,以便未來(lái)的HTTP請(qǐng)求重用現(xiàn)在的連接,直到客戶(hù)端或服務(wù)器端決定將其關(guān)閉為止骚灸。在HTTP1.0中使用長(zhǎng)連接需要添加請(qǐng)求頭 Connection: Keep-Alive糟趾,而在HTTP 1.1 所有的連接默認(rèn)都是長(zhǎng)連接,除非特殊聲明不支持( HTTP請(qǐng)求報(bào)文首部加上Connection: close )甚牲。服務(wù)器端按照FIFO原則來(lái)處理不同的Request义郑。
chunked編碼傳輸:該編碼將實(shí)體分塊傳送并逐塊標(biāo)明長(zhǎng)度,直到長(zhǎng)度為0塊表示傳輸結(jié)束丈钙,這在實(shí)體長(zhǎng)度未知時(shí)特別有用(比如由數(shù)據(jù)庫(kù)動(dòng)態(tài)產(chǎn)生的數(shù)據(jù))
字節(jié)范圍請(qǐng)求:HTTP1.1支持傳送內(nèi)容的一部分非驮。比方說(shuō),當(dāng)客戶(hù)端已經(jīng)有內(nèi)容的一部分雏赦,為了節(jié)省帶寬劫笙,可以只向服務(wù)器請(qǐng)求一部分芙扎。該功能通過(guò)在請(qǐng)求消息中引入了range頭域來(lái)實(shí)現(xiàn),它允許只請(qǐng)求資源的某個(gè)部分填大。在響應(yīng)消息中Content-Range頭域聲明了返回的這部分對(duì)象的偏移值和長(zhǎng)度戒洼。如果服務(wù)器相應(yīng)地返回了對(duì)象所請(qǐng)求范圍的內(nèi)容,則響應(yīng)碼206(Partial Content)
Pipelining(請(qǐng)求流水線)
另外允华,HTTP 1.1還新增了如下特性:
請(qǐng)求消息和響應(yīng)消息都支持Host頭域:在HTTP1.0中認(rèn)為每臺(tái)服務(wù)器都綁定一個(gè)唯一的IP地址圈浇,因此,請(qǐng)求消息中的URL并沒(méi)有傳遞主機(jī)名(hostname)靴寂。但隨著虛擬主機(jī)技術(shù)的發(fā)展磷蜀,在一臺(tái)物理服務(wù)器上可以存在多個(gè)虛擬主機(jī)(Multi-homed Web Servers),并且它們共享一個(gè)IP地址榨汤。因此蠕搜,Host頭的引入就很有必要了怎茫。
新增了一批Request method:HTTP1.1增加了OPTIONS,PUT, DELETE, TRACE, CONNECT方法
緩存處理:HTTP/1.1在1.0的基礎(chǔ)上加入了一些cache的新特性收壕,引入了實(shí)體標(biāo)簽,一般被稱(chēng)為e-tags轨蛤,新增更為強(qiáng)大的Cache-Control頭蜜宪。?
4、HTTP 2.0
HTTP 2.0是下一代HTTP協(xié)議祥山,目前應(yīng)用還非常少圃验。主要特點(diǎn)有:
多路復(fù)用(二進(jìn)制分幀)。HTTP 2.0最大的特點(diǎn):不會(huì)改動(dòng)HTTP 的語(yǔ)義缝呕,HTTP 方法澳窑、狀態(tài)碼、URI 及首部字段供常,等等這些核心概念上一如往常摊聋,卻能致力于突破上一代標(biāo)準(zhǔn)的性能限制,改進(jìn)傳輸性能栈暇,實(shí)現(xiàn)低延遲和高吞吐量麻裁。而之所以叫2.0,是在于新增的二進(jìn)制分幀層源祈。在二進(jìn)制分幀層上煎源, HTTP 2.0 會(huì)將所有傳輸?shù)男畔⒎指顬楦〉南⒑蛶?duì)它們采用二進(jìn)制格式的編碼 香缺,其中HTTP1.x的首部信息會(huì)被封裝到Headers幀手销,而我們的request body則封裝到Data幀里面。
HTTP 2.0 通信都在一個(gè)連接上完成图张,這個(gè)連接可以承載任意數(shù)量的雙向數(shù)據(jù)流锋拖。相應(yīng)地馏慨,每個(gè)數(shù)據(jù)流以消息的形式發(fā)送,而消息由一或多個(gè)幀組成姑隅,這些幀可以亂序發(fā)送写隶,然后再根據(jù)每個(gè)幀首部的流標(biāo)識(shí)符重新組裝。
頭部壓縮:當(dāng)一個(gè)客戶(hù)端向相同服務(wù)器請(qǐng)求許多資源時(shí)讲仰,像來(lái)自同一個(gè)網(wǎng)頁(yè)的圖像慕趴,將會(huì)有大量的請(qǐng)求看上去幾乎同樣的,這就需要壓縮技術(shù)對(duì)付這種幾乎相同的信息鄙陡。
隨時(shí)復(fù)位:HTTP1.1一個(gè)缺點(diǎn)是當(dāng)HTTP信息有一定長(zhǎng)度大小數(shù)據(jù)傳輸時(shí)冕房,你不能方便地隨時(shí)停止它,中斷TCP連接的代價(jià)是昂貴的趁矾。使用HTTP2的RST_STREAM將能方便停止一個(gè)信息傳輸耙册,啟動(dòng)新的信息,在不中斷連接的情況下提高帶寬利用效率毫捣。
服務(wù)器端推流:Server Push详拙。客戶(hù)端請(qǐng)求一個(gè)資源X蔓同,服務(wù)器端判斷也許客戶(hù)端還需要資源Z饶辙,在無(wú)需事先詢(xún)問(wèn)客戶(hù)端情況下將資源Z推送到客戶(hù)端,客戶(hù)端接受到后斑粱,可以緩存起來(lái)以備后用弃揽。
優(yōu)先權(quán)和依賴(lài):每個(gè)流都有自己的優(yōu)先級(jí)別,會(huì)表明哪個(gè)流是最重要的则北,客戶(hù)端會(huì)指定哪個(gè)流是最重要的矿微,有一些依賴(lài)參數(shù),這樣一個(gè)流可以依賴(lài)另外一個(gè)流尚揣。優(yōu)先級(jí)別可以在運(yùn)行時(shí)動(dòng)態(tài)改變涌矢,當(dāng)用戶(hù)滾動(dòng)頁(yè)面時(shí),可以告訴瀏覽器哪個(gè)圖像是最重要的惑艇,你也可以在一組流中進(jìn)行優(yōu)先篩選蒿辙,能夠突然抓住重點(diǎn)流。