干貨筆記 | HTTP協(xié)議版本及特征
掃描二維碼
隨時(shí)隨地手機(jī)看文章
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è)由客戶端到Web服務(wù)器的TCP連接,由客戶端發(fā)起一個(gè)請(qǐng)求,然后由Web服務(wù)器返回頁(yè)面內(nèi)容,然后連接會(huì)關(guān)閉。如果請(qǐng)求的頁(yè)面不存在,也不會(huì)返回任何錯(cuò)誤碼。
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)始支持客戶端通過(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ì)文件類請(qǐng)求影響較大。head of line blocking會(huì)導(dǎo)致帶寬無(wú)法被充分利用,以及后續(xù)健康請(qǐng)求被阻塞。
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)在的連接,直到客戶端或服務(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)客戶端已經(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)求流水線)
其他特性
- 請(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)簽,一般被稱為e-tags,新增更為強(qiáng)大的Cache-Control頭。
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è)客戶端向相同服務(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??蛻舳苏?qǐng)求一個(gè)資源X,服務(wù)器端判斷也許客戶端還需要資源Z,在無(wú)需事先詢問(wèn)客戶端情況下將資源Z推送到客戶端,客戶端接受到后,可以緩存起來(lái)以備后用。
- 優(yōu)先權(quán)和依賴:每個(gè)流都有自己的優(yōu)先級(jí)別,會(huì)表明哪個(gè)流是最重要的,客戶端會(huì)指定哪個(gè)流是最重要的,有一些依賴參數(shù),這樣一個(gè)流可以依賴另外一個(gè)流。優(yōu)先級(jí)別可以在運(yùn)行時(shí)動(dòng)態(tài)改變,當(dāng)用戶滾動(dòng)頁(yè)面時(shí),可以告訴瀏覽器哪個(gè)圖像是最重要的,你也可以在一組流中進(jìn)行優(yōu)先篩選,能夠突然抓住重點(diǎn)流。
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!