摘要:二進制分幀在應(yīng)用層與傳輸層之間增加一個二進制分幀層,以此達到在不改動的語義,方法狀態(tài)碼及首部字段的情況下,突破的性能限制,改進傳輸性能,實現(xiàn)低延遲和高吞吐量。
歡迎一起交流
歡迎關(guān)注我的個人公眾號,不定期更新自己的工作心得。
影響一個網(wǎng)絡(luò)請求的因素主要有兩個,帶寬和延遲。今天的網(wǎng)絡(luò)基礎(chǔ)建設(shè)已經(jīng)使得帶寬得到極大的提升,大部分時候都是延遲在影響響應(yīng)速度。
連接無法復(fù)用連接無法復(fù)用會導(dǎo)致每次請求都經(jīng)歷三次握手和慢啟動。三次握手在高延遲的場景下影響較明顯,慢啟動則對文件類大請求影響較大。
head of line blockinghead of line blocking會導(dǎo)致帶寬無法被充分利用,以及后續(xù)健康請求被阻塞。
HTTP1.0 -> HTTP1.1
不過pipelining并不是救世主,它也存在不少缺陷:
pipelining只能適用于http1.1,一般來說,支持http1.1的server都要求支持pipelining
只有冪等的請求(GET,HEAD)能使用pipelining,非冪等請求比如POST不能使用,因為請求之間可能會存在先后依賴關(guān)系。
head of line blocking并沒有完全得到解決,server的response還是要求依次返回,遵循FIFO(first in first out)原則。也就是說如果請求1的response沒有回來,2,3,4,5的response也不會被送回來。
絕大部分的http代理服務(wù)器不支持pipelining。
和不支持pipelining的老服務(wù)器協(xié)商有問題。
可能會導(dǎo)致新的Front of queue blocking問題。
HTTP2 VS HTTP1.1 多路復(fù)用多路復(fù)用通過多個請求stream共享一個tcp連接的方式,解決了http1.x holb(head of line blocking)的問題,降低了延遲同時提高了帶寬的利用率。
壓縮頭部HTTP/2.0規(guī)定了在客戶端和服務(wù)器端會使用并且維護「首部表」來跟蹤和存儲之前發(fā)送的鍵值對,對于相同的頭部,不必再通過請求發(fā)送,只需發(fā)送一次。
事實上,如果請求中不包含首部(例如對同一資源的輪詢請求),那么首部開銷就是零字節(jié)。此時所有首部都自動使用之前請求發(fā)送的首部。
如果首部發(fā)生變化了,那么只需要發(fā)送變化了數(shù)據(jù)在Headers幀里面,新增或修改的首部幀會被追加到“首部表”。首部表在 HTTP2.0的連接存續(xù)期內(nèi)始終存在,由客戶端和服務(wù)器共同漸進地更新。
二進制分幀在應(yīng)用層與傳輸層之間增加一個二進制分幀層,以此達到“在不改動HTTP的語義,HTTP 方法、狀態(tài)碼、URI及首部字段的情況下,突破HTTP1.1的性能限制,改進傳輸性能,實現(xiàn)低延遲和高吞吐量?!?/p>
在二進制分幀層上,HTTP2.0會將所有傳輸?shù)男畔⒎指顬楦〉南⒑蛶?并對它們采用二進制格式的編碼,其中HTTP1.x的首部信息會被封裝到Headers幀,而我們的request body則封裝到Data幀里面。
客戶端和服務(wù)器可以把HTTP消息分解為互不依賴的幀,然后亂序發(fā)送,最后再在另一端把它們重新組合起來。注意,同一鏈接上有多個不同方向的數(shù)據(jù)流在傳輸。客戶端可以一邊亂序發(fā)送stream,也可以一邊接收者服務(wù)器的響應(yīng),而服務(wù)器那端同理。
請求優(yōu)先級多路復(fù)用導(dǎo)致所有資源都是并行發(fā)送,那么就需要「優(yōu)先級」的概念了,這樣就可以對重要的文件進行先傳輸,加速頁面的渲染。
服務(wù)器推送服務(wù)器推送是指在客戶端請求之前發(fā)送數(shù)據(jù)的機制。
另外有一點值得注意的是,客戶端如果退出某個業(yè)務(wù)場景,出于流量或者其它因素需要取消server push,也可以通過發(fā)送RST_STREAM類型的frame來做到。
HTTP2 實踐這里使用 Node.js 作為服務(wù)器端語言。
1. 生成TLS證書如果想要在生產(chǎn)環(huán)境中使用HTTP2,那么你可以去這里生成一個證書。
如果你僅僅開發(fā)環(huán)境使用,那么我們可以自己生成一個自簽名的TSL證書。
安裝OpenSSH
使用OpenSSH生成私鑰
openssl genrsa -des3 -passout pass:1234 -out server.pass.key 2048`
這里 1234 為私鑰密碼,如果你不想使用密碼,則可以去除私鑰密碼,敲入如下密令:
openssl rsa -passin pass:x -in server.pass.key -out server.key
創(chuàng)建 證書簽名請求
這里使用無密碼私鑰,如果使用帶密碼私鑰,只需將server.key更換為server.pass.key即可,密令如下
openssl req -new -key server.key -out server.csr
創(chuàng)建證書
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
通過以上四個步驟,我們得到了三個文件
server.key 你的TSL證書私鑰
server.csr 你的TSL證書簽名請求
server.crt 你的TSL證書
2. 使用Node.js 創(chuàng)建服務(wù)器安裝 node-http2 模塊
npm install http2
創(chuàng)建服務(wù)器
var options = { key: fs.readFileSync("./server.key"), cert: fs.readFileSync("./server.crt") }; require("http2").createServer(options, function(request, response) { response.end("Hello world!"); }).listen(8080);
啟動服務(wù)器
node index.js
使用瀏覽器訪問
http://localhost:8080
到此,一個簡單的Demo就完成了。
Demo源碼下載點擊這里訪問完整Demo
https://github.com/zhanyouwei...
測試結(jié)果對比通過上面兩張截圖可以發(fā)現(xiàn),使用了HTTP2后,同樣的請求,在數(shù)據(jù)傳輸大小與速度上都有非常大的提升,幾乎可以預(yù)見,不久的將來,HTTP2將會大放異彩。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/79421.html
摘要:基礎(chǔ)理論是二進制協(xié)議這是一個復(fù)用協(xié)議。使用現(xiàn)狀案例淘寶案例京東案例知乎案例二月的公司不好意思,我們還沒用上這么牛逼的協(xié)議。本文內(nèi)容很淺,想要了解更多的知識,可以去知乎搜相關(guān)文章和回答。 目的 http2出來也有段時間了,很多網(wǎng)站都已經(jīng)實際應(yīng)用了它,而我還活在http1.1的時代,趁著還年輕,記性還行,花點時間研究了http2在nodejs中的使用。 http2基礎(chǔ)理論 HTTP2是二...
摘要:前端基本功常見概念一點這里前端基本功常見概念二點這里前端基本功常見概念三點這里什么是原型鏈當(dāng)一個引用類型繼承另一個引用類型的屬性和方法時候就會產(chǎn)生一個原型鏈。函數(shù)式編程是聲明式而不是命令式,并且應(yīng)用程序狀態(tài)通過純函數(shù)流轉(zhuǎn)。 前端基本功-常見概念(一) 點這里前端基本功-常見概念(二) 點這里前端基本功-常見概念(三) 點這里 1.什么是原型鏈 當(dāng)一個引用類型繼承另一個引用類型的屬性和方...
摘要:背景狀態(tài)碼有哪些,這也是一個很高頻的面試問題??偨Y(jié)僅僅三個狀態(tài)碼,都可以牽涉到如此豐富的知識,對于狀態(tài)碼,我們不能只是片面的去背誦狀態(tài)碼及對應(yīng)的含義,要去主動挖掘,深入,借助狀態(tài)碼來建立自己的網(wǎng)絡(luò)體系。 背景 http狀態(tài)碼有哪些,這也是一個很高頻的面試問題。一般大家都知道404頁面不存在,500服務(wù)器錯誤,301重定向,302臨時重定向,200ok,401未授權(quán)啥的。 如果只是簡單的...
閱讀 3401·2023-04-26 00:07
閱讀 4047·2021-11-23 10:08
閱讀 3060·2021-11-22 09:34
閱讀 933·2021-09-22 15:27
閱讀 1812·2019-08-30 15:54
閱讀 3859·2019-08-30 14:07
閱讀 987·2019-08-30 11:12
閱讀 754·2019-08-29 18:44