HTTP/2 协议入门
? 一、2015年, HTTP/2發(fā)布。
二、二進(jìn)制協(xié)議
HTTP/2是一個(gè)二進(jìn)制協(xié)議,頭信息和數(shù)據(jù)體都是二進(jìn)制,并且統(tǒng)稱為“幀”(frame),頭信息幀和數(shù)據(jù)幀。
二進(jìn)制協(xié)議的一個(gè)好處是,可以定義額外的幀。HTTP/2定義了近10種幀,為將來的高級(jí)應(yīng)用打好了基礎(chǔ)。
三、多工
HTTP/2復(fù)用TCP連接,在一個(gè)連接里,客戶端和瀏覽器都可以同時(shí)發(fā)送多個(gè)請(qǐng)求東或回應(yīng),而不用按照順序一一對(duì)應(yīng),這樣就避免了“隊(duì)頭堵塞”。
舉個(gè)例來說,在一個(gè)TCP連接里面,服務(wù)器同時(shí)收到了A請(qǐng)求和B請(qǐng)求,于是先回應(yīng)A請(qǐng)求,結(jié)果發(fā)現(xiàn)處理過程非常耗時(shí),這時(shí)就可以發(fā)送A請(qǐng)求已經(jīng)處理好的部分,接著回應(yīng)B請(qǐng)求,完成后,再發(fā)送A請(qǐng)求剩下的部分。這樣雙向的實(shí)時(shí)的通信就叫做多工(Multiplexing)。
四、數(shù)據(jù)流
因?yàn)?span style="white-space:pre">HTTP/2的數(shù)據(jù)包是不按順序發(fā)送的,同一個(gè)連接里面連接的數(shù)據(jù)包,可能屬于不同的回應(yīng)。因此必須要對(duì)數(shù)據(jù)包作標(biāo)記,指出它屬于哪個(gè)回應(yīng)。
HTTP/2將每個(gè)請(qǐng)求或回應(yīng)的所有數(shù)據(jù)包稱為一個(gè)數(shù)據(jù)流(stream)。每個(gè)數(shù)據(jù)流都有獨(dú)一無二的編號(hào)。數(shù)據(jù)包發(fā)送的時(shí)候都必須標(biāo)記數(shù)據(jù)流ID,用來區(qū)分它屬于哪個(gè)數(shù)據(jù)流。另外還規(guī)定,客戶端發(fā)出的數(shù)據(jù)流ID一律為奇數(shù),服務(wù)器發(fā)出的一律為偶數(shù)。
數(shù)據(jù)流發(fā)送到一半的時(shí)候客戶端和服務(wù)端都可以發(fā)送信號(hào)(RST_STREAM幀),取消這個(gè)數(shù)據(jù)流。1.1版本取消數(shù)據(jù)流的唯一方法就是關(guān)閉TCP連接。這就是說HTTP/2可以取消某一次請(qǐng)求,同時(shí)保證TCP連接還打開著,可為其它請(qǐng)求所用。
客戶端還可以指定數(shù)據(jù)流的優(yōu)先級(jí),優(yōu)先級(jí)越高,服務(wù)器就會(huì)越早回應(yīng)。
五、頭信息壓縮
HTTP協(xié)議不 帶有狀態(tài),每次請(qǐng)求都必須附上所有信息。所以,請(qǐng)求的很多字段都是重復(fù)的,比如 Cookie 和 User Agent , 一模一樣的內(nèi)容,每次請(qǐng)求都必須附帶,這會(huì)浪費(fèi)很多帶寬,也影響速度。
HTTP/2對(duì)這一點(diǎn)作了優(yōu)化,引入了頭信息壓縮機(jī)制(header compression)。 一方面,頭信息使用 gzip 或 compress 壓縮后再發(fā)送;另一方面,客戶端和服務(wù)端同時(shí)維護(hù)一張頭信息表,所有字段都會(huì)存入這個(gè)表,生成一個(gè)索引號(hào),以后就不發(fā)送同樣字段了,只發(fā)送索引號(hào),這樣就提高速度了。
六、服務(wù)器推送
HTTP/2允許服務(wù)器未經(jīng)請(qǐng)求,主動(dòng)向客戶端發(fā)送資源,這叫做服務(wù)器推送(server push)。
常見場景是客戶端請(qǐng)求一個(gè)網(wǎng)頁,這個(gè)網(wǎng)頁里面包含很多靜態(tài)資源。正常情況下,客戶端必須收到網(wǎng)頁后,解析 HTML 源碼,發(fā)現(xiàn)有靜態(tài)資源再發(fā)出靜態(tài)資源請(qǐng)求。其實(shí),服務(wù)器可以預(yù)期到客戶端請(qǐng)求網(wǎng)頁后,很可能會(huì)再請(qǐng)求靜態(tài)資源,所以就主動(dòng)把這些靜態(tài)資源隨著網(wǎng)頁一起發(fā)送給客戶端了。
原文參見:程序員的那些事
總結(jié)
以上是生活随笔為你收集整理的HTTP/2 协议入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 构建高性能ASP.NET站点 网站优化需
- 下一篇: Linux 下查看系统是32位 还是64