基于HTTP的協(xié)議:
在建立 HTTP 標(biāo)準(zhǔn)規(guī)范時(shí)耐齐,制訂者主要想把 HTTP 當(dāng)作傳輸 HTML 文檔的協(xié)議。隨著時(shí)代的發(fā)展蒋情,Web 的用途更具多樣性埠况,比如演化成在線購物網(wǎng)站辕翰、SNS(Social Networking Service狈谊,社交網(wǎng)絡(luò)服務(wù))沟沙、企業(yè)或組織內(nèi)部的各種管理工具矛紫。
而這些網(wǎng)站所追求的功能可通過 Web 應(yīng)用和腳本程序?qū)崿F(xiàn)颊咬。即使這些功能已經(jīng)滿足需求贪染,在性能上卻未必最優(yōu)催享,這是因?yàn)?HTTP 協(xié)議上的限制以及自身性能有限因妙。
消除 HTTP 瓶頸的 SPDY:
Google 在 2010 年發(fā)布了 SPDY(取自 SPeeDY攀涵,發(fā)音同 speedy)洽沟,其開發(fā)目標(biāo)旨在解決 HTTP 的性能瓶頸,縮短 Web 頁面的加載時(shí)間50%)怒详。
SPDY - The Chromium Projects? ?http://www.chromium.org/spdy/
HTTP的瓶頸
一條連接上只可發(fā)送一個(gè)請(qǐng)求踪区。
請(qǐng)求只能從客戶端開始缎岗〈矗客戶端不可以接收除響應(yīng)以外的指令。
請(qǐng)求 / 響應(yīng)首部未經(jīng)壓縮就發(fā)送拦盹。首部信息越多延遲越大掌敬。
發(fā)送冗長的首部。每次互相發(fā)送相同的首部造成的浪費(fèi)較多楷兽。
可任意選擇數(shù)據(jù)壓縮格式华临。非強(qiáng)制壓縮發(fā)送。
Ajax(Asynchronous JavaScript and XML揭厚, 異 步 JavaScript 與 XML 技術(shù))解決方法:
一種有效利用 JavaScript 和 DOM(Document Object Model筛圆,文檔對(duì)象模型)的操作太援,以達(dá)到局部 Web 頁面替換加載的異步通信手段扳碍。和以前的同步通信相比笋敞,由于它只更新一部分頁面,響應(yīng)中傳輸?shù)臄?shù)據(jù)量會(huì)因此而減少赛惩,這一優(yōu)點(diǎn)顯而易見坊秸。
Comet(彗星)的解決方法:
一旦服務(wù)器端有內(nèi)容更新了褒搔,Comet 不會(huì)讓請(qǐng)求等待喷面,而是直接給客戶端返回響應(yīng)惧辈。這是一種通過延遲應(yīng)答,模擬實(shí)現(xiàn)服務(wù)器端向客戶端推送(Server Push)的功能念逞。
陸續(xù)出現(xiàn)的 Ajax 和 Comet 等提高易用性的技術(shù)翎承,一定程度上使 HTTP得到了改善,但 HTTP 協(xié)議本身的限制也令人有些束手無策瘩例。為了進(jìn)行根本性的改善垛贤,需要有一些協(xié)議層面上的改動(dòng)趣倾。
SPDY 的設(shè)計(jì)與功能:
SPDY 沒有完全改寫 HTTP 協(xié)議儒恋,而是在 TCP/IP 的應(yīng)用層與運(yùn)輸層之間通過新加會(huì)話層的形式運(yùn)作。同時(shí),考慮到安全性問題箱锐,SPDY 規(guī)定通信中使用 SSL劳较。
SPDY 以會(huì)話層的形式加入观蜗,控制對(duì)數(shù)據(jù)的流動(dòng),但還是采用 HTTP建立通信連接抖仅。因此撤卢,可照常使用 HTTP 的 GET 和 POST 等方 法放吩、Cookie 以及 HTTP 報(bào)文等羽杰。
使用 SPDY 后,HTTP 協(xié)議額外獲得以下功能莉测。
多路復(fù)用流
通過單一的 TCP 連接集灌,可以無限制處理多個(gè) HTTP 請(qǐng)求欣喧。所有請(qǐng)求的處理都在一條 TCP 連接上完成,因此 TCP 的處理效率得到提高益涧。
備注:這個(gè)特性沒啥稀奇的闲询,http 1.1已經(jīng)有相關(guān)支持浅辙。忘了的同學(xué)翻我之前的第一節(jié)課視頻~
賦予請(qǐng)求優(yōu)先級(jí)
SPDY 不僅可以無限制地并發(fā)處理請(qǐng)求,還可以給請(qǐng)求逐個(gè)分配優(yōu)先級(jí)順序鸽捻。這樣主要是為了在發(fā)送多個(gè)請(qǐng)求時(shí)御蒲,解決因帶寬低而導(dǎo)致響應(yīng)變慢的問題厚满。
壓縮 HTTP 首部
壓縮 HTTP 請(qǐng)求和響應(yīng)的首部碘箍。這樣一來敲街,通信產(chǎn)生的數(shù)據(jù)包數(shù)量和發(fā)送的字節(jié)數(shù)就更少了严望。
注:HTTP本身也有壓縮功能像吻,只不過壓縮的是body,不是首部挽拂。忘了的翻我的第一節(jié)課~
更詳細(xì)的解釋:https://www.cnblogs.com/zhaow/p/9754161.html
推送功能
支持服務(wù)器主動(dòng)向客戶端推送數(shù)據(jù)的功能骨饿。這樣宏赘,服務(wù)器可直接發(fā)送數(shù)據(jù)察署,而不必等待客戶端的請(qǐng)求贴汪。
注:這個(gè)功能HTTP 1.1木有,直到HTTP2业簿,原生HTTP才提供這個(gè)功能梅尤。
如果用過C#,用過ASP.NET MVC的同學(xué)還會(huì)指導(dǎo)誊辉,做這個(gè)事兒,還有個(gè)---SignalR堕澄。首選web socket通訊方式蛙紫,如果不支持,那就蛻化為長輪詢坑傅。
SignalR參考資料:
https://www.cnblogs.com/wintersun/p/4148223.html
https://www.cnblogs.com/Wddpct/p/5650015.html
SPDY并沒有被廣泛的使用起來~
使用瀏覽器進(jìn)行全雙工通信的WebSocket:
WebSocket 通信協(xié)議在 2011 年 12 月 11 日唁毒,被 RFC 6455 - The WebSocket Protocol 定為標(biāo)準(zhǔn)蒜茴。
WebSocket 的設(shè)計(jì)與功能
WebSocket,即 Web 瀏覽器與 Web 服務(wù)器之間全雙工通信標(biāo)準(zhǔn)浆西。其中粉私,WebSocket 協(xié)議由 IETF 定為標(biāo)準(zhǔn),WebSocket API 由 W3C 定為標(biāo)準(zhǔn)近零。仍在開發(fā)中的 WebSocket 技術(shù)主要是為了解決 Ajax 和 Comet
里 XMLHttpRequest 附帶的缺陷所引起的問題诺核。
WebSocket 協(xié)議:
一旦 Web 服務(wù)器與客戶端之間建立起 WebSocket 協(xié)議的通信連接,之后所有的通信都依靠這個(gè)專用協(xié)議進(jìn)行久信。通信過程中可互相發(fā)送JSON窖杀、XML、HTML 或圖片等任意格式的數(shù)據(jù)入篮。
一旦 Web 服務(wù)器與客戶端之間建立起 WebSocket 協(xié)議的通信連接潮售,之后所有的通信都依靠這個(gè)專用協(xié)議進(jìn)行鞍泉。通信過程中可互相發(fā)送JSON训枢、XML睦刃、HTML 或圖片等任意格式的數(shù)據(jù)。
HTTP輪詢與WebSocket通訊之間的對(duì)比:
WebSocket協(xié)議的主要特點(diǎn)
推送功能
支持由服務(wù)器向客戶端推送數(shù)據(jù)的推送功能。這樣搓彻,服務(wù)器可直接發(fā)送數(shù)據(jù)骑篙,而不必等待客戶端的請(qǐng)求谎势。
減少通信量
只要建立起 WebSocket 連接台谍,就希望一直保持連接狀態(tài)。和 HTTP 相比,不但每次連接時(shí)的總開銷減少卒废,而且由于 WebSocket 的首部信息很小,通信量也相應(yīng)減少了。
為了實(shí)現(xiàn) WebSocket 通信辰企,在 HTTP 連接建立之后竹观,需要完成一次“握手”(Handshaking)的步驟。
握手·請(qǐng)求
為了實(shí)現(xiàn) WebSocket 通信,需要用到 HTTP 的 Upgrade 首部字段,告知服務(wù)器通信協(xié)議發(fā)生改變,以達(dá)到握手的目的
Sec-WebSocket-Key 字段內(nèi)記錄著握手過程中必不可少的鍵值。
Sec-WebSocket-Protocol 字段內(nèi)記錄使用的子協(xié)議。
忘了這個(gè)首部關(guān)鍵字的同學(xué),還回去翻我的第一節(jié)課~
WebSocket API
JavaScript 可調(diào)用“The WebSocket API”(http://www.w3.org/TR/websockets/,由 W3C 標(biāo)準(zhǔn)制定)內(nèi)提供的 WebSocket 程序接口,以實(shí)現(xiàn) WebSocket 協(xié)議下全雙工通信。
以下為調(diào)用 WebSocket API,每 50ms 發(fā)送一次數(shù)據(jù)的實(shí)例杆查。
參考資料:
阮一峰關(guān)于WebSocket的帖子:http://www.ruanyifeng.com/blog/2017/05/websocket.html
使用js檢測瀏覽器是否支持WebSocket:https://blog.csdn.net/jsyxiaoba/article/details/84025295
期盼已久的 HTTP/2.0:
...
參考資料:
《一文讀懂HTTP/2 及 HTTP/3特性》