成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

HTTP2.0知識(shí)點(diǎn)有哪些

本篇內(nèi)容主要講解“HTTP2.0知識(shí)點(diǎn)有哪些”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“HTTP2.0知識(shí)點(diǎn)有哪些”吧!

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、成都小程序開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了長(zhǎng)子免費(fèi)建站歡迎大家使用!

1.二進(jìn)制分幀

HTTP2.0的根本改進(jìn)還是新增的二進(jìn)制分幀層,不同于HTTP1.X使用換行符分割純文本,二進(jìn)制分幀層更加簡(jiǎn)潔,處理起來(lái)也更加高效。這里所謂的層,指的是位于套接字接口與應(yīng)用可見(jiàn)的高層HTTP API間的一個(gè)新機(jī)制:HTTP語(yǔ)義,包括各種動(dòng)詞、方法、首部,都不受影響,不同的是傳輸它們的編碼方式變了。HTTP 1.X以換行符作為純文本的分隔符,而HTTP 2.0將所有傳輸?shù)男畔⒎指顬楦〉南⒑蛶?,并?duì)它們采用二進(jìn)制格式的編碼。示例如下:

由上圖可知,在HTTP1.1傳輸數(shù)據(jù)時(shí),首部和數(shù)據(jù)是一塊發(fā)送的,每次傳輸都是需要帶有首部信息;在HTTP2.0中,首部信息被分為一個(gè)獨(dú)立的幀進(jìn)行發(fā)送,數(shù)據(jù)幀在在首部幀發(fā)送后,再進(jìn)行發(fā)送,而且采用首部壓縮后,每次傳輸只需要發(fā)送改動(dòng)的部分即可,極大提高了數(shù)據(jù)發(fā)送的效率。

1.1.分幀首部

在建立HTTP2.0連接之后,客戶端與服務(wù)器會(huì)通過(guò)交換幀進(jìn)行通信,幀是HTTP2.0協(xié)議的最小單位。所有的幀都擁有一個(gè)8字節(jié)的首部,具體格式如下:

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 | R |     Length (14)           |   Type (8)    |   Flags (8)   |
 +-+-+-----------+---------------+-------------------------------+
 |R|                 Stream Identifier (31)                      |
 +=+=============================================================+
 |                   Frame Payload (0...)                      ...
 +---------------------------------------------------------------+
  • R : 保留的2位字段。這些字節(jié)的語(yǔ)義是未定義的,并且在發(fā)送的時(shí)候必須保持未設(shè)置(0),接收的時(shí)候必須被忽略此字段。

  • Length : 14位無(wú)符號(hào)整數(shù)的幀主體長(zhǎng)度。8字節(jié)長(zhǎng)度的幀報(bào)頭信息不計(jì)算在此內(nèi),主體最大可能長(zhǎng)度為2^14-1(16383)字節(jié),整個(gè)幀(包括首部)的最大長(zhǎng)度是最大的幀長(zhǎng)度是16391字節(jié)。

  • Type : 幀的8位類(lèi)型。幀類(lèi)型定義了剩余的幀報(bào)頭和幀主體將如何被解釋。具體實(shí)現(xiàn)必須在收到未知幀類(lèi)型(任何未在文檔中定義的幀)時(shí)作為連接錯(cuò)誤中的類(lèi)型協(xié)議錯(cuò)誤(PROTOCOL_ERROR)處理。

  • Flags : 為幀類(lèi)型保留的8字節(jié)字段有具體的布爾標(biāo)識(shí)。 標(biāo)識(shí)針對(duì)確定的幀類(lèi)型賦予特定的語(yǔ)義。確定幀類(lèi)型定義語(yǔ)義以外的標(biāo)示必須被忽略,并且必須在發(fā)送的時(shí)候保留未設(shè)置(0)。

  • R : 1位的保留字段。這個(gè)字段的語(yǔ)義未設(shè)置并且必須在發(fā)送的時(shí)候保持未設(shè)置(0),在接受的時(shí)候必須被忽略。

  • Stream Identifier : 31字節(jié)的流標(biāo)識(shí)符,唯一標(biāo)識(shí)HTTP2.0的流。0是保留的,標(biāo)明幀是與連接相關(guān)作為一個(gè)整體而不是一個(gè)單獨(dú)的流。

通過(guò)這個(gè)共享的8字節(jié)首部,可以很快確定幀的類(lèi)型、標(biāo)志和長(zhǎng)度,而且每一幀的長(zhǎng)度也是事先定義好的,解析器也可以迅速的找到下一幀的開(kāi)始,并進(jìn)行解析,這對(duì)于HTTP1.1X來(lái)說(shuō)也是一個(gè)很大的提升。

1.2.幀類(lèi)型

不管是在連接管理或單獨(dú)的流中,每種幀都為了特定的目的而服務(wù)。在HTTP2.0中,共定義了以下10種幀類(lèi)型:

  • DATA:用于傳輸HTTP消息體;

  • HEADERS:用于傳輸關(guān)于流的額外的首部字段;

  • PRIORITY:用于指定或重新指定引用資源的優(yōu)先級(jí);

  • RST_STREAM:用于知道流的非正常終止;

  • SETTINGS:用于通知兩端通信方式的配置數(shù)據(jù);

  • PSUH_PROMISE:用于發(fā)出創(chuàng)建流和服務(wù)器引用資源的要約;

  • PING:用于計(jì)算往返時(shí)間,執(zhí)行活性檢查;

  • GOWAY:通知遠(yuǎn)端對(duì)等端不要在這個(gè)連接上建立新流;

  • WINDOW_UPDATE:用于針對(duì)個(gè)別流或個(gè)別連接實(shí)現(xiàn)流量控制;

  • CONTINUATION:用于繼續(xù)一系列首部片段。

注:服務(wù)器可以利用GOWAY類(lèi)型的幀告訴客戶端要處理的最后一個(gè)流ID,從而消除一些請(qǐng)求競(jìng)爭(zhēng),而且瀏覽器也可以據(jù)此智能地重試或取消“懸著的”請(qǐng)求。這也是保證復(fù)用連接安全的一個(gè)重要和必要的功能。

HTTP2.0性能增強(qiáng)的核心,全在于新增的二進(jìn)制分幀層,它定義了如何封裝HTTP消息并在客戶端與服務(wù)器之間傳輸。由于在HTTP2.0中使用了新的組幀方式,這樣一來(lái),客戶端和服務(wù)器為了相互理解,必須都使用新的二進(jìn)制編碼機(jī)制,所以HTTP1.x客戶端無(wú)法理解只支持HTTP2.0的服務(wù)器,反之亦然。但這并不影響我們使用HTTP2.0,現(xiàn)有的應(yīng)用不用關(guān)注這些變化,因?yàn)榭蛻舳撕头?wù)器會(huì)替它們完成必要的分幀工作。

1.3.流、消息和幀

新的二進(jìn)制分幀機(jī)制改變了客戶端與服務(wù)器之間交互數(shù)據(jù)的方式,為了更好的理解HTTP2.0中這一核心變化,下面介紹流、消息、幀這三個(gè)概念及區(qū)別:

  • 流(stream):已建立的連接上的雙向字節(jié)流,HTTP/2連接中的虛擬通道。

  • 消息(message):與邏輯消息對(duì)應(yīng)的完整的一系列數(shù)據(jù)幀。

  • 幀(frame):HTTP2.0通信的最小單位,包括根據(jù)幀類(lèi)型結(jié)構(gòu)的字節(jié)的報(bào)頭和可變長(zhǎng)度的序列,每個(gè)幀包含首部。

所有HTTP2.0通信都在一個(gè)TCP連接上完成,這個(gè)連接可以承載任意數(shù)量的雙向數(shù)據(jù)流。相應(yīng)的,每個(gè)數(shù)據(jù)流以消息的形式發(fā)送,而消息由一個(gè)或多個(gè)幀組成,這些幀可以亂序發(fā)送,然后根據(jù)每個(gè)幀首部的流標(biāo)識(shí)符重新組裝。幀是HTTP2.0中的最小通信單位,不同類(lèi)型的幀有特殊的作用。

2.多路復(fù)用

2.1.隊(duì)列傳輸與多路復(fù)用

在HTTP1.x中,如果客戶端想發(fā)送多個(gè)并行的請(qǐng)求以及改進(jìn)性能,那么必須使用多個(gè)TCP連接,而且存在隊(duì)首阻塞問(wèn)題,嚴(yán)重影響數(shù)據(jù)的傳輸效率。在HTTP2.0中,二進(jìn)制分幀機(jī)制突破了這些限制,實(shí)現(xiàn)了多向請(qǐng)求和響應(yīng),客戶端和服務(wù)器可以把HTTP消息分解為互不依賴(lài)的幀,然后亂序發(fā)送,然后在接收端重新組裝,這樣就完成了消息的傳輸。示例如下:

由上圖可知,在同一個(gè)連接中,有三個(gè)流在同時(shí)傳輸,有兩個(gè)是從服務(wù)端發(fā)給客戶端的,也有一個(gè)是從客戶端發(fā)送到服務(wù)端,這就大大的提高了連接的利用率。
這個(gè)新的機(jī)制是革命性的,會(huì)在整個(gè)WEB技術(shù)棧中引發(fā)一系列連鎖反應(yīng),從而帶來(lái)巨大的性能提升,因?yàn)椋?/p>

  • 可以并行交錯(cuò)地發(fā)送請(qǐng)求,請(qǐng)求之間互不影響;

  • 可以并行交錯(cuò)地發(fā)送響應(yīng),響應(yīng)之間互不干擾;

  • 只使用一個(gè)連接即可并行發(fā)送多個(gè)請(qǐng)求和響應(yīng);

  • 消除不必要的延遲,從而減少頁(yè)面加載時(shí)間;

  • 不必再為繞過(guò)HTTP1.X限制而做多余的工作。

HTTP2.0的二進(jìn)制分幀機(jī)制解決了HTTP1.X中存在的隊(duì)首阻塞問(wèn)題,也消除了并行處理和發(fā)送請(qǐng)求及響應(yīng)時(shí)對(duì)多個(gè)連接的依賴(lài)。這樣,就會(huì)使應(yīng)用更快、開(kāi)發(fā)更簡(jiǎn)單、部署成本更低,也會(huì)減少客戶端和服務(wù)器的CPU及內(nèi)存占用。

2.2.每個(gè)來(lái)源一個(gè)連接

在可以實(shí)現(xiàn)連接的多路復(fù)用后,HTTP2.0不再依賴(lài)多個(gè)TCP連接去實(shí)現(xiàn)多流并行了?,F(xiàn)在,多個(gè)數(shù)據(jù)流都拆分成很多幀,而這些幀可以交錯(cuò),還可以分別優(yōu)先級(jí)。于是,所有的 HTTP2.0連接都是持久化的,而且客戶端與服務(wù)器之間也只需要一個(gè)連接即可。每個(gè)來(lái)源一個(gè)連接顯著減少了相關(guān)的資源占用:連接路徑上的套接字管理工作少了,內(nèi)存占用少了,連接吞吐量大了。所以,很多層面上都有不小的提高:

  • 所有數(shù)據(jù)流的優(yōu)先級(jí)次序始終如一;

  • 壓縮上下文單一使得壓縮效果更好;

  • 由于TCP連接減少而使網(wǎng)絡(luò)擁塞狀況得以改觀;

  • 慢啟動(dòng)時(shí)間減少,擁塞和丟包恢復(fù)速度更快。

大多數(shù)HTTP連接的時(shí)間都很短,而且是突發(fā)性的,但TCP只在長(zhǎng)時(shí)間連接傳輸大塊數(shù)據(jù)時(shí)效率才高。HTTP2.0通過(guò)讓所有數(shù)據(jù)流共用同一個(gè)連接,可以更有效地使用TCP連接。HTTP2.0不僅能夠減少網(wǎng)絡(luò)延遲,還有助于提高吞吐量和降低運(yùn)營(yíng)成本。
注:任何事物都有其兩面性,每個(gè)來(lái)源一個(gè)連接當(dāng)然也會(huì)帶來(lái)一些問(wèn)題:

  • 雖然消除了HTTP隊(duì)首阻塞現(xiàn)象,但TCP層次上仍然存在隊(duì)首阻塞;

  • 如果TCP窗口縮放被禁用,那帶寬延遲積效應(yīng)可能會(huì)限制連接的吞吐量;

  • 丟包時(shí),TCP擁塞窗口會(huì)縮小。

雖然有上述問(wèn)題影響HTTP2.0的性能,但實(shí)驗(yàn)表明一個(gè)TCP連接仍然是目前最佳的策略:壓縮和優(yōu)先級(jí)排定帶來(lái)的性能提升,已經(jīng)超過(guò)了隊(duì)首阻塞造成的負(fù)面效應(yīng)。與所有其他的性能優(yōu)化一樣,去掉一個(gè)性能瓶頸,又會(huì)帶來(lái)新的瓶頸。對(duì)HTTP2.0而言,TCP很可能就是下一個(gè)瓶頸。這也是服務(wù)器端TCP配置對(duì)HTTP2.0至關(guān)重要的一個(gè)原因。

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

在HTTP消息被分解為很多獨(dú)立的幀之后,就可以通過(guò)優(yōu)化這些幀的交錯(cuò)和傳輸順序,可以讓最緊要的幀優(yōu)先發(fā)送,以確保關(guān)鍵任務(wù)的快速展開(kāi)。那么如何定義這些幀的發(fā)送順序就是一個(gè)難題,為方便起見(jiàn),在HTTP / 2標(biāo)準(zhǔn)允許每個(gè)流具有相關(guān)聯(lián)的權(quán)重和依賴(lài)性:

  • 每個(gè)流可被分配1~256之間的權(quán)重值,具有相同父節(jié)點(diǎn)的流應(yīng)該根據(jù)權(quán)重比例來(lái)分配資源;

  • 每個(gè)流可聲明對(duì)另一流的顯式依賴(lài)性,包含一個(gè)依賴(lài)偏好設(shè)置表示分配資源給特定的流而不是所依賴(lài)的流。

通過(guò)流依賴(lài)和權(quán)重,客戶端可以構(gòu)建一個(gè)“優(yōu)先級(jí)樹(shù)”(如下圖所示),將這個(gè)樹(shù)發(fā)送到服務(wù)端,表達(dá)客戶端愿意以怎樣的方式接收響應(yīng);服務(wù)端在接收到該“優(yōu)先級(jí)樹(shù)”后,可以根據(jù)這個(gè)信息,通過(guò)協(xié)調(diào)相關(guān)服務(wù)器資源返回響應(yīng),如CPU、存儲(chǔ)器、網(wǎng)絡(luò)等資源,優(yōu)先處理高優(yōu)先級(jí)的流。并且一旦響應(yīng)數(shù)據(jù)是可用的,服務(wù)端將分配更多的帶寬以確保高優(yōu)先級(jí)的快速響應(yīng)。

HTTP 2.0內(nèi)的一個(gè)流只能設(shè)置一個(gè)唯一的流依賴(lài),被依賴(lài)流就是當(dāng)前流的父節(jié)點(diǎn)流,如果省略了流依賴(lài)的聲明,則默認(rèn)依賴(lài)于“根流”。聲明一個(gè)流的依賴(lài)性表明,如果可能的話,父流應(yīng)先于子流進(jìn)行資源分配和響應(yīng),例如請(qǐng)?zhí)幚砗晚憫?yīng)C前交付響應(yīng)D。
具有相同的父流的同級(jí)流應(yīng)該按照其權(quán)重比例分配服務(wù)器資源。例如,如果流A具優(yōu)先級(jí)重量為12,他的同級(jí)兄弟流B的權(quán)重為4,那么確定二者應(yīng)分配的資源比例為:

  • 計(jì)算所有流的權(quán)重總和:4 + 12 = 16;

  • 計(jì)算每個(gè)流所占總和的比例:A = 12 / 16,6B = 4/16。

由上可知,如A流得到四分之三可用資源分配的話,B流應(yīng)得到可利用的資源的四分之一。為了更好的理解優(yōu)先級(jí)機(jī)制,下面從左到右依次介紹上圖的優(yōu)先級(jí)重組情況:

  • 無(wú)論是流A或B指定一個(gè)相同的父依賴(lài),還是是依賴(lài)于隱式的“根流”:A的優(yōu)先級(jí)權(quán)重為12,B的優(yōu)先級(jí)權(quán)重為4,因此基于比例權(quán)重--流B應(yīng)該得到分配給流A資源的三分之一;

  • D是依賴(lài)于根流,C是依賴(lài)D。因此,D應(yīng)提前于C,此時(shí)權(quán)重對(duì)資源分配是無(wú)關(guān)緊要的,因?yàn)闆](méi)有其他流與C同級(jí);

  • D應(yīng)在C之前接收到資源的充分分配;C應(yīng)在A和B之前接收資源的充分分配;B流應(yīng)該接收分配給A流資源的三分之一;

  • 在E和C之前,D應(yīng)該得到充分的資源分配;E和C應(yīng)在A和B之前得到平等的分配;A和B應(yīng)根據(jù)它們的權(quán)重進(jìn)行比例分配。

從上述示例可知,流依賴(lài)和權(quán)重的組合提供了一個(gè)表達(dá)資源優(yōu)先次序的方式,這可以為不同的資源定義優(yōu)先級(jí),可以更好的提高性能。HTTP/2協(xié)議也允許客戶端在任何時(shí)間點(diǎn)更新優(yōu)先級(jí)信息,優(yōu)先級(jí)信息可以像它們被創(chuàng)建一樣使用報(bào)頭幀或者使用優(yōu)先級(jí)幀來(lái)明確指定或者改變。有了這個(gè)優(yōu)先級(jí)標(biāo)識(shí),客戶端和服務(wù)器就可以在處理不同的流時(shí)采取不同的策略,以最優(yōu)的方式發(fā)送流、消息和幀。優(yōu)先級(jí)的目的是允許終端表達(dá)它如何讓對(duì)等端管理并發(fā)流時(shí)分配資源。更重要的是,在發(fā)送容量有限時(shí)優(yōu)先級(jí)能用來(lái)選擇流來(lái)傳輸幀。提供優(yōu)先級(jí)信息是可選的,沒(méi)有明確指定時(shí)使用默認(rèn)值。
流依賴(lài)和權(quán)重表達(dá)一個(gè)傳輸偏好,而不是一個(gè)要求,因此不保證一個(gè)特定的處理或傳輸順序。也就是說(shuō),客戶端不能強(qiáng)制服務(wù)器以流優(yōu)先級(jí)的優(yōu)先級(jí)來(lái)處理特定順序的流。在選擇HTTP2.0服務(wù)器時(shí),需要考慮以下幾個(gè)問(wèn)題:

  • 如果服務(wù)器對(duì)所有優(yōu)先級(jí)視而不見(jiàn)怎么辦?

  • 高優(yōu)先值流一定優(yōu)先處理嗎?

  • 是否存在不同優(yōu)先級(jí)的流應(yīng)該交錯(cuò)的情況?

如果服務(wù)器不理睬所有優(yōu)先值,那么可能會(huì)導(dǎo)致應(yīng)用響應(yīng)變慢:瀏覽器明明在等關(guān)鍵的CSS和JavaScript,服務(wù)器卻在發(fā)送圖片,從而造成渲染阻塞。然而,嚴(yán)格按照規(guī)定的優(yōu)先級(jí)次序也可能帶來(lái)次優(yōu)的結(jié)果,因?yàn)檫@或許會(huì)再次引入隊(duì)首阻塞問(wèn)題,即某個(gè)高優(yōu)先級(jí)的慢請(qǐng)求會(huì)不必要地阻塞其他資源的交付。
所以,服務(wù)器可以并且應(yīng)該交錯(cuò)發(fā)送不同優(yōu)先級(jí)別的幀,只要可能,高優(yōu)先級(jí)流都應(yīng)該優(yōu)先傳輸,不過(guò)為了更高效地利用底層連接,不同優(yōu)先級(jí)的混合也是必須的。因此優(yōu)先級(jí)的表達(dá)僅僅是一個(gè)建議。

4.流量控制

流量控制的定義是用來(lái)保護(hù)端點(diǎn)在資源約束條件下的操作。流量控制解決的情況是接收端在一個(gè)流上處理數(shù)據(jù)的同時(shí)同樣想繼續(xù)處理同個(gè)連接上的其他流。在同一個(gè)TCP連接上傳輸多個(gè)數(shù)據(jù)流,就意味著要共享帶寬。標(biāo)定數(shù)據(jù)流的優(yōu)先級(jí)有助于按序交付,但只有優(yōu)先級(jí)還不足以確定多個(gè)數(shù)據(jù)流或多個(gè)連接間的資源分配,為解決這個(gè)問(wèn)題,HTTP2.0為數(shù)據(jù)流和連接的流量控制提供了一個(gè)簡(jiǎn)單的機(jī)制:

  • 流量控制基于每一跳進(jìn)行,而非端到端的控制;

  • 流量控制基于窗口更新幀進(jìn)行,即接收方廣播自己準(zhǔn)備接收某個(gè)數(shù)據(jù)流的多少字節(jié),以及對(duì)整個(gè)連接要接收多少字節(jié);

  • 流量控制窗口大小通過(guò)WINDOW_UPDATE幀更新,這個(gè)字段指定了流ID和窗口大小遞增機(jī)制;

  • 每個(gè)新的流及整個(gè)連接的流量控制窗口初始值是65,535字節(jié);

  • 流控制方向性,即接收方可能根據(jù)自己的情況為每個(gè)流乃至整個(gè)連接設(shè)置任意窗口大??;流量控制可以由接收方禁用,包括針對(duì)個(gè)別的流和針對(duì)整個(gè)連接。

  • 幀類(lèi)型決定了是否適用流量控制規(guī)則。本文檔定義的幀中,只有DATA幀受流量控制;所有其他的幀不受廣播的流量控制窗口影響。這保證了重要的控制幀不因流量控制所阻塞。

HTTP/2只標(biāo)準(zhǔn)化WINDOW_UPDATE幀格式。HTTP2.0標(biāo)準(zhǔn)沒(méi)有規(guī)定任何特定的算法、值,或者什么時(shí)候發(fā)送WINDOW_UPDATE幀,因此實(shí)現(xiàn)可以選擇自己的算法以匹配自己的應(yīng)用場(chǎng)景,從而求得最佳性能。
流量控制方案等確保同一連接上的流相互之間不會(huì)造成破壞性的干擾。流量控制在單個(gè)流及整個(gè)連接過(guò)程中使用,HTTP/2 通過(guò)使用WINDOW_UPDATE幀類(lèi)型來(lái)提供流量控制。上面的機(jī)制和TCP流量控制是一樣的思路,然而僅憑TCP流量控制是不能對(duì)一條HTTP2.0連接內(nèi)的多個(gè)流實(shí)行差異化策略,所以專(zhuān)門(mén)有了HTTP2.0流量控制機(jī)制的出現(xiàn)。

5.服務(wù)器推送

5.1.服務(wù)器端推送

HTTP2.0新增了一個(gè)強(qiáng)大的功能,就是服務(wù)器可以對(duì)一個(gè)客戶端請(qǐng)求發(fā)送多個(gè)響應(yīng)。換句話說(shuō),出了最初請(qǐng)求的相應(yīng)外,服務(wù)器還可以額外向用戶端推送資源,而無(wú)需客戶端明確地請(qǐng)求。示例如下:

這樣一個(gè)機(jī)制需要解決的問(wèn)題是什么呢?我們知道,通常一個(gè)web應(yīng)用往往包含數(shù)十個(gè)資源,客戶端需要分析服務(wù)器提供的文檔才能逐個(gè)找到它們。那么為什么不讓服務(wù)器提前就把這些資源推送給客戶端,從而減少額外的延時(shí)呢?服務(wù)器已經(jīng)知道客戶端下一步要請(qǐng)求什么資源了,這時(shí)候服務(wù)器端推薦就可以大展拳腳了。事實(shí)上,網(wǎng)頁(yè)上嵌入的CSS及JS,或通過(guò)URI嵌入的其他資源,也可以算是服務(wù)器端推送。把資源直接插入到文檔中,就是把資源直接推送給客戶端,而無(wú)需客戶端主動(dòng)請(qǐng)求。在HTTP2.0中,唯一的不同就是可以把這個(gè)過(guò)程從應(yīng)用中拿出來(lái),放到HTTP協(xié)議本身來(lái)實(shí)現(xiàn),而且?guī)?lái)了如下好處:

  • 客戶端可以緩存推送的資源;

  • 客戶端可以拒絕推送的資源;

  • 推送資源可以由不同的頁(yè)面共享;

  • 推送資源可以與其他資源一起復(fù)用;

  • 服務(wù)器可以按照優(yōu)先級(jí)推送資源.

有了服務(wù)器推送后,HTTP1.X時(shí)代的插入或嵌入資源的做法就可以退出歷史舞臺(tái)了。唯一有必要采用嵌入資源方式的情況就是該資源只供一個(gè)頁(yè)面使用,而且編碼代價(jià)不大,除此之外,其他所有的場(chǎng)景都應(yīng)該使用服務(wù)器端推送。

注:所有服務(wù)器推送流都由PUSH_PROMISE發(fā)端,它除了對(duì)原始請(qǐng)求的響應(yīng)之外,服務(wù)器向客戶端發(fā)出的有意推送所述資源的信號(hào)。PUSH_PROMISE幀中只包含有要約資源的HTTP首部。

客戶端在接收到PUSH_PROMISE幀之后,可以視自身需求選擇接收或拒絕這個(gè)流。服務(wù)端推送也有一些限制:

  • 首先,服務(wù)必須遵循請(qǐng)求-響應(yīng)的循環(huán),只能借著請(qǐng)求的響應(yīng)推送資源,服務(wù)器端并不能隨意發(fā)起推送;

  • 其次,PUSH_PROMISE幀必須在返回響應(yīng)之前發(fā)送,以免客戶端出現(xiàn)競(jìng)爭(zhēng)狀態(tài),否則會(huì)出現(xiàn)客戶端請(qǐng)求的恰好服務(wù)器打算推送的情景。

因?yàn)橥扑偷捻憫?yīng)是有效地逐跳,中介端接從服務(wù)端接收到推送響應(yīng)的可以選擇不轉(zhuǎn)發(fā)這些到客戶端。也就是說(shuō),如何使用推送響應(yīng)取決于這些中介端。相等的,中介可能選擇不推送的額外的響應(yīng)給客戶端,不需要服務(wù)端進(jìn)行任何操作。服務(wù)端只能推送可以被緩存的響應(yīng);被承諾的請(qǐng)求必須是安全的,而且絕對(duì)不能包含一個(gè)請(qǐng)求主體。

5.2.如何實(shí)現(xiàn)服務(wù)器端推送

服務(wù)器推送為優(yōu)化應(yīng)用的資源交付提供了很多可能,然而,服務(wù)器到底該如何確定哪些資源可以或應(yīng)該推送呢?HTTP2.0并沒(méi)有給出詳盡的規(guī)定,那么就有可能出現(xiàn)多種策略,每種策略可能會(huì)考慮一種應(yīng)用或服務(wù)器使用場(chǎng)景。

  • 應(yīng)用可以在自身的代碼中明確發(fā)起服務(wù)器推送;

  • 應(yīng)用可以通過(guò)額外的HTTP首部向服務(wù)器發(fā)送信號(hào),列出它希望推送的資源;

  • 服務(wù)器可以不依賴(lài)應(yīng)用而自動(dòng)學(xué)習(xí)相關(guān)資源,通過(guò)分析來(lái)推測(cè)出需要推送的資源。

上面只是幾個(gè)可能的策略,當(dāng)然也有很多其他的實(shí)現(xiàn)方式,可能是手工調(diào)用低級(jí)的API,也可能是一種全自動(dòng)的實(shí)現(xiàn)??傊?,服務(wù)器推送領(lǐng)域?qū)?huì)出現(xiàn)很多有意思的創(chuàng)新。推送的資源將直接進(jìn)入客戶端緩存,就像客戶端請(qǐng)求了一樣,不存在客戶端API或JS回調(diào)方法等通知機(jī)制,可以用于確定資源何時(shí)到達(dá),整個(gè)過(guò)程對(duì)運(yùn)行在瀏覽器中的web應(yīng)用來(lái)說(shuō)好像根本不存在。

雖然現(xiàn)在還不知道如何確定哪些資源可以或應(yīng)該推送,但是如何發(fā)起推送的機(jī)制已經(jīng)建立,由服務(wù)端先發(fā)起推送請(qǐng)求,客戶端再進(jìn)行推送響應(yīng)。具體如下:

Push Requests

服務(wù)端推送語(yǔ)義上等同于服務(wù)端響應(yīng)一個(gè)請(qǐng)求;然而,這種情況下請(qǐng)求也是由服務(wù)端發(fā)送的,作為一個(gè)PUSH_PROMISE幀。PUSH_PROMISE包含了一個(gè)報(bào)頭區(qū)塊,含有完整的服務(wù)端屬性請(qǐng)求報(bào)頭字段。推送的響應(yīng)總是與客戶端的一個(gè)明確的請(qǐng)求相關(guān)。服務(wù)端在這個(gè)明確的請(qǐng)求流上發(fā)送PUSH_PROMISE幀。PUSH_PROMISE幀一般包含被承諾的流標(biāo)識(shí)符,從可用的服務(wù)端流標(biāo)識(shí)符中選擇。服務(wù)端應(yīng)當(dāng)在發(fā)送任何被承諾的響應(yīng)之前發(fā)送一個(gè)PUSH_PROMISE幀。這避免了客戶端在收到任何PUSH_PROMISE幀前發(fā)出請(qǐng)求而出現(xiàn)的競(jìng)賽。PUSH_PROMISE可以由服務(wù)端在任意由客戶端打開(kāi)的流上發(fā)送。

Push Responses

發(fā)送PUSH_PROMISE幀后,服務(wù)端可以開(kāi)始接收被推送進(jìn)來(lái)的響應(yīng)作為一個(gè)由服務(wù)端發(fā)起的使用被承諾流標(biāo)識(shí)的流的響應(yīng)。一旦客戶端接收到PUSH_PROMISE幀并且選擇接受推送的響應(yīng),客戶端不應(yīng)該對(duì)被承諾的響應(yīng)發(fā)起請(qǐng)求,直到被承諾的流被關(guān)閉為止。如果客戶端以任何理由決定不希望接受服務(wù)端推送的響應(yīng),或者服務(wù)端花費(fèi)太長(zhǎng)時(shí)間才開(kāi)始發(fā)送承諾的響應(yīng),客戶端可以發(fā)送一個(gè)RST_STREAM幀,使用CANCEL或者REFUSED_STREAM碼來(lái)關(guān)聯(lián)被推送的流標(biāo)識(shí)符。

6.首部壓縮

HTTP的每一次通信都會(huì)攜帶一組首部,用于描述傳輸?shù)馁Y源及其屬性。在HTTP1.X中,這些元數(shù)據(jù)是以純文本形式發(fā)送的,通常會(huì)給每個(gè)請(qǐng)求增加500-800字節(jié)的負(fù)荷。如果算上COOKIE,增加的負(fù)荷會(huì)達(dá)到上千字節(jié),為了減少這些開(kāi)銷(xiāo)并提升性能,HTTP2.0會(huì)壓縮首部元數(shù)據(jù):

  • HTTP2.0在客戶端和服務(wù)器端使用“首部表”來(lái)跟蹤和存儲(chǔ)之前發(fā)送的鍵-值對(duì),對(duì)于相同的數(shù)據(jù),不再通過(guò)每次請(qǐng)求和響應(yīng)發(fā)送;

  • 首部表在HTTP2.0的連接存續(xù)期內(nèi)始終存在,由客戶端和服務(wù)器共同漸進(jìn)的更新;

  • 每個(gè)新的首部鍵-值對(duì)要么被追加到當(dāng)前表的末尾,要么替換表中之前的值。

于是,HTTP2.0連接的兩端都知道已經(jīng)發(fā)送了哪些首部,這些首部的值是什么,從而可以針對(duì)之前的數(shù)據(jù)只編碼發(fā)送這些差異數(shù)據(jù)。在通信期間幾乎不會(huì)改變的鍵值對(duì)只需發(fā)送一次即可,這樣就大大提高了數(shù)據(jù)的載荷。示例如下:

HTTP/1 的狀態(tài)行信息(Method、Path、Status 等),在 HTTP/2 中被拆成鍵值對(duì)放入頭部(冒號(hào)開(kāi)頭的那些),同樣可以享受到字典和哈夫曼壓縮。另外,HTTP/2 中所有頭部名稱(chēng)必須小寫(xiě)。
頭部壓縮需要客戶端和服務(wù)器端做好以下工作:

  • 維護(hù)一份相同的靜態(tài)字典(Static Table),包含常見(jiàn)的頭部名稱(chēng),以及特別常見(jiàn)的頭部名稱(chēng)與值的組合;

  • 維護(hù)一份相同的動(dòng)態(tài)字典(Dynamic Table),可以動(dòng)態(tài)地添加內(nèi)容;

  • 支持基于靜態(tài)哈夫曼碼表的哈夫曼編碼(Huffman Coding)。

靜態(tài)字典的作用有兩個(gè):

  • 1)對(duì)于完全匹配的頭部鍵值對(duì),例如 :method: GET,可以直接使用一個(gè)字符表示;

  • 2)對(duì)于頭部名稱(chēng)可以匹配的鍵值對(duì),例如 cookie: xxxxxxx,可以將名稱(chēng)使用一個(gè)字符表示。

同時(shí),瀏覽器可以告知服務(wù)端,將 cookie: xxxxxxx 添加到動(dòng)態(tài)字典中,這樣后續(xù)整個(gè)鍵值對(duì)就可以使用一個(gè)字符表示了。類(lèi)似的,服務(wù)端也可以更新對(duì)方的動(dòng)態(tài)字典。需要注意的是,動(dòng)態(tài)字典跟具體連接上下文有關(guān),需要為每個(gè) HTTP2.0 連接維護(hù)不同的字典。使用字典可以極大地提升壓縮效果,其中靜態(tài)字典在首次請(qǐng)求中就可以使用。對(duì)于靜態(tài)、動(dòng)態(tài)字典中不存在的內(nèi)容,還可以使用哈夫曼編碼來(lái)減小體積。HTTP2.0 使用了一份靜態(tài)哈夫曼碼表,也需要內(nèi)置在客戶端和服務(wù)端之中。哈夫曼編碼的核心理念就是使用最少的位數(shù)表示最多的信息,HTTP2.0中這份哈夫曼編碼表是根據(jù)一個(gè)大樣本的HTTP報(bào)頭的統(tǒng)計(jì)數(shù)據(jù)生成,經(jīng)常出現(xiàn)的字符會(huì)用較短的二進(jìn)制數(shù)標(biāo)識(shí),出現(xiàn)頻率較低的字符用較長(zhǎng)的二進(jìn)制數(shù)標(biāo)識(shí),這樣就保證了綜合來(lái)看報(bào)頭信息占用了較少的空間,進(jìn)一步壓縮了報(bào)頭信息。

在服務(wù)端接收到壓縮過(guò)的報(bào)頭信息后,會(huì)先進(jìn)行哈夫曼編碼解碼,得到報(bào)首信息后,再結(jié)合維護(hù)的靜態(tài)字典和動(dòng)態(tài)字典信息得出完整的報(bào)首信息,隨后進(jìn)行請(qǐng)求的處理和響應(yīng)。在需要更新動(dòng)態(tài)字典信息時(shí),對(duì)字典進(jìn)行更新。

HTTP2.0壓縮算法:SPDY早期版本使用zlib和自定義的字典壓縮所有的HTTP首部,可以減少85%-88%的首部開(kāi)銷(xiāo),從而顯著減少加載頁(yè)面的時(shí)間。然而,在2012年夏天,出現(xiàn)了針對(duì)TLS和SPDY壓縮算法的CRIME安全攻擊,于是,zlib算法被撤銷(xiāo),取而代之的是前面介紹的新索引表算法。該算法沒(méi)有類(lèi)似的安全問(wèn)題,但可以實(shí)現(xiàn)相差無(wú)幾的性能提升。

7.HTTP2.0升級(jí)與發(fā)現(xiàn)

向HTTP2.0的遷移不可能瞬間完成,無(wú)論服務(wù)器端還是客戶端都需要進(jìn)行必要的更新升級(jí)才能使用。好消息是,大多數(shù)現(xiàn)代瀏覽器都內(nèi)置有高效的后臺(tái)升級(jí)機(jī)制,對(duì)大多數(shù)既有用戶來(lái)說(shuō),這些瀏覽器可以很快的支持HTTP2.0,不會(huì)帶來(lái)很大困擾。然而,服務(wù)器端和中間設(shè)備的升級(jí)、更新就不是那么容易,是一個(gè)長(zhǎng)期的過(guò)程,而且很費(fèi)力、費(fèi)錢(qián)。

HTTP1.X至少還會(huì)存續(xù)十年以上,大多數(shù)服務(wù)器和客戶端在此期間必須同時(shí)支持1.x和2.0標(biāo)準(zhǔn)。于是,支持HTTP2.0的客戶端在發(fā)起新請(qǐng)求之前,必須能發(fā)現(xiàn)服務(wù)器及中間設(shè)備是否支持HTTP2.0協(xié)議。有以下三種情況:

  • 通過(guò)TLS和ALPN發(fā)起的新的HTTPS連接;

  • 根據(jù)之前的信息發(fā)起的新的HTTP連接;

  • 沒(méi)有之前的信息而發(fā)起新的HTTP連接;

HTTPS協(xié)商過(guò)程中有一個(gè)環(huán)節(jié)會(huì)使用ALPN發(fā)現(xiàn)和協(xié)商HTTP2.0支持情況。有 ALPN 的情況下 TLS 握手信息中包含了客戶端支持的協(xié)議列表,服務(wù)端直接選擇 HTTP2,所有協(xié)商在握手階段一次完成,無(wú)需額外的報(bào)文。
注:應(yīng)用層協(xié)議談判(ALPN)是一個(gè)TLS擴(kuò)展,支持在TLS握手過(guò)程中進(jìn)行協(xié)議協(xié)商,從而省去通過(guò)HTTP的Upgrade機(jī)制所需的額外往返延遲。過(guò)程如下:

  • 客戶在ClientHello消息添加新的ProtocolNameList字段,包含支持的應(yīng)用程序協(xié)議列表。

  • 該服務(wù)器檢查ProtocolNameList字段,并在ServerHello消息中返回一個(gè)ProtocolName字段,用來(lái)指示服務(wù)器端選擇的協(xié)議。

  • 服務(wù)器可能只響應(yīng)其中一個(gè)協(xié)議,如果它不支持任何客戶端要求的協(xié)議,那么它可能選擇中止連接。其結(jié)果是,TLS握手完成后,安全隧道建立好了,客戶端和服務(wù)端也協(xié)商好了所使用的應(yīng)用協(xié)議 - 它們可以立即開(kāi)始通信。

通過(guò)非加密信道建立HTTP2.0連接需要多做一些工作,因?yàn)镠TTP1.0和HTTP2.0都使用80端口,又沒(méi)有服務(wù)器是否支持HTTP2.0的其他任何信息,此時(shí)客戶端只能使用HTTP upgrade 機(jī)制通過(guò)協(xié)商確定適當(dāng)?shù)膮f(xié)議:

GET /default.htm HTTP/1.1
Host: server.example.com
Connection: Upgrade, HTTP2-Settings
Upgrade: h3c
HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>

不支持HTTP/2的服務(wù)端對(duì)請(qǐng)求返回一個(gè)不包含升級(jí)的報(bào)頭字段的響應(yīng):

HTTP/1.1 200 OK
Content-Length: 243
Content-Type: text/html
...

支持HTTP/2的服務(wù)端可以返回一個(gè)101(轉(zhuǎn)換協(xié)議)響應(yīng)來(lái)接受升級(jí)請(qǐng)求:

HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: h3c
...

在101空內(nèi)容響應(yīng)終止后,服務(wù)端可以開(kāi)始發(fā)送HTTP/2幀。這些幀必須包含一個(gè)發(fā)起升級(jí)的請(qǐng)求的響應(yīng)。第一個(gè)被服務(wù)端發(fā)送的HTTP/2幀是一個(gè)設(shè)置(SETTINGS)幀。在收到101響應(yīng)后,客戶端發(fā)送一個(gè)包含設(shè)置(SETTINGS)幀的連接序言。

使用這種Upgrade流,如果服務(wù)器不支持HTTP2.0,就立即返回HTTP1.1響應(yīng)。否則,服務(wù)器就會(huì)以HTTP1.1格式返回101 switching protocols響應(yīng),然后立即切換到HTTP2.0并使用新的二進(jìn)制分幀協(xié)議返回響應(yīng)。無(wú)論哪種情況,都不需要額外往返。

最后,如果客戶端因?yàn)樽约罕4嬗谢蛲ㄟ^(guò)其他手段(如DNS記錄,手工配置)獲得了HTTP2.0的支持信息,也可以直接發(fā)送HTTP2.0分幀,而不必依賴(lài)Upgrade機(jī)制。

8.HTTP2.0數(shù)據(jù)傳輸示例

發(fā)起新流

在發(fā)送應(yīng)用數(shù)據(jù)之前,必須創(chuàng)建一個(gè)新流并隨之發(fā)送相應(yīng)的元數(shù)據(jù),比如優(yōu)先級(jí)、HTTP首部等。HTTP2.0協(xié)議規(guī)定客戶端和服務(wù)器都可以發(fā)起流,因此有兩種可能:

  • 客戶端通過(guò)發(fā)送HEADERS幀來(lái)發(fā)起流,這個(gè)幀里包含帶有新流ID的公用首部,可以選的31位優(yōu)先值,以及一組HTTP鍵值對(duì)首部;

  • 服務(wù)器端通過(guò)發(fā)送PSUH_PROMISE幀來(lái)發(fā)起推送流,這個(gè)幀與HEADERS等效,但它包含要約流ID,沒(méi)有優(yōu)先值。
    HEADERS幀示例如下:

    這兩種幀的類(lèi)型字段都只用于溝通新流的元數(shù)據(jù),凈荷會(huì)在DATA幀中單獨(dú)發(fā)送。

    發(fā)送應(yīng)用數(shù)據(jù)

    創(chuàng)建新流并發(fā)送HTTP首部之后,接下來(lái)就是利用DATA幀發(fā)送應(yīng)用數(shù)據(jù)。應(yīng)用數(shù)據(jù)可以分為多個(gè)DATA幀,最后一幀要翻轉(zhuǎn)幀首部的END_STREAM字段。數(shù)據(jù)凈荷不會(huì)被另行編碼或壓縮。編碼方式取決于應(yīng)用或服務(wù)器,純文本,gzip壓縮、圖片或適配壓縮格式都可以。

到此,相信大家對(duì)“HTTP2.0知識(shí)點(diǎn)有哪些”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

分享名稱(chēng):HTTP2.0知識(shí)點(diǎn)有哪些
路徑分享:http://jinyejixie.com/article8/pgshop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站Google、定制網(wǎng)站、品牌網(wǎng)站制作App開(kāi)發(fā)、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷(xiāo)型網(wǎng)站建設(shè)
鄂尔多斯市| 廉江市| 宾阳县| 会同县| 玉树县| 通化市| 大新县| 许昌市| 云梦县| 新乡市| 长兴县| 佳木斯市| 大关县| 邢台县| 屏东市| 北京市| 萨迦县| 许昌市| 西乡县| 苍溪县| 平阳县| 满城县| 东兴市| 时尚| 儋州市| 鄂伦春自治旗| 垦利县| 芦山县| 澳门| 沙洋县| 淮北市| 璧山县| 高尔夫| 信阳市| 乐亭县| 读书| 屏东县| 汽车| 重庆市| 静宁县| 聂荣县|