HTTP建立之初,只是用于傳輸HTML文檔,所以功能非常簡單。但如今的Web應(yīng)用的用途越來越多樣,需求也不斷變化,HTTP已無法滿足。在不拋棄HTTP的基礎(chǔ)上,新建立了一些協(xié)議用以滿足新需求。
HTTP的性能瓶頸
用戶龐大的社交網(wǎng)站在短時間內(nèi)就會有大量用戶發(fā)布內(nèi)容,Web頁面則要在短時間內(nèi)就對大量內(nèi)容進(jìn)行更新。這需要做到服務(wù)器的數(shù)據(jù)一有更新,就需要將內(nèi)容反饋到客戶端的界面上。
根據(jù)HTTP協(xié)議標(biāo)準(zhǔn),其很難滿足這種短間隔內(nèi)更新大量數(shù)據(jù)的需求:
- 一條連接上只可發(fā)送一個請求
- 請求只能從客戶端開始,客戶端不可以接收除響應(yīng)以外的指令
- 請求 / 響應(yīng)首部未經(jīng)壓縮就發(fā)送,首部信息越多延遲越大
- 發(fā)送冗長的首部,每次互相發(fā)送相同的首部造成的浪費(fèi)較多
- 可任意選擇數(shù)據(jù)壓縮格式,非強(qiáng)制壓縮發(fā)送
解決一:Ajax
Ajax是一種可以達(dá)到局部加載更新Web頁面的異步通信手段。和原始的同步通信相比,它只更新一部分頁面,響應(yīng)中傳輸?shù)臄?shù)據(jù)量會因此而減少,優(yōu)勢明顯。
Ajax的核心技術(shù)是名為XHR的API,通過JS語言的調(diào)用就能和服務(wù)器進(jìn)行HTTP通信。借用這種手段,就能從已加載完畢的Web頁面上發(fā)起請求,只更新局部頁面。
缺點(diǎn):利用Ajax實(shí)時從服務(wù)器獲取內(nèi)容,可能會導(dǎo)致大量請求產(chǎn)生。另外,Ajax仍未解決HTTP協(xié)議本身存在的問題,即首部冗余和非強(qiáng)制壓縮等。
解決二:Comet
為了解決Ajax大量請求的問題,Comet通過延遲應(yīng)答,模擬實(shí)現(xiàn)服務(wù)器向客戶端推送的功能。
通常服務(wù)器在接收到請求后會立即響應(yīng),但Comet會先將響應(yīng)掛起,當(dāng)服務(wù)器內(nèi)有內(nèi)容更新時,再返回該響應(yīng)。因此,服務(wù)器一旦有更新,就可以立即返回給客戶端。
缺點(diǎn):為了保留相應(yīng),一次連接的時間也變長了。為了維持連接也會消耗更多的資源。并且,首部冗余和非強(qiáng)制壓縮等HTTP本身的問題也沒有解決。
解決三:SPDY
Google于2010年發(fā)布了SPDY,目的在于解決HTTP的性能瓶頸,縮短Web頁面的加載時間(50%)。
對HTTP本身的小修小改都無法突破HTTP本身的限制,所以需要協(xié)議層的改動。SPDY協(xié)議就是為了消除HTTP的瓶頸。
SPDY是在TCP/IP的應(yīng)用層與運(yùn)輸層之間通過新加會話層的形式運(yùn)作。SPDY以會話層的形式加入,控制對數(shù)據(jù)的流動。但還是采用HTTP建立通信連接。
使用SPDY后,HTTP獲得額外功能:
- 多路復(fù)用流
通過單一的TCP連接,可以無限制處理多個HTTP請求。所有請求的處理都在一條TCP連接上完成,因此TCP的處理效率得到提高。 - 賦予請求優(yōu)先級
不僅可以無限并行處理請求,還可以給請求分配優(yōu)先級,解決因帶寬不夠而導(dǎo)致響應(yīng)變慢的問題。 - 壓縮HTTP首部
壓縮首部,通信產(chǎn)生的數(shù)據(jù)包數(shù)量和發(fā)送的字節(jié)數(shù)就更少了。 - 推送功能
支持服務(wù)器主動向客戶端推送數(shù)據(jù)的功能。 - 服務(wù)器提示功能
服務(wù)器可主動提示客戶端請求所需的資源,避免不必要的請求。
缺點(diǎn):該技術(shù)在實(shí)際應(yīng)用中效果不佳, 因?yàn)镾PDY基本上只是將單個域名(IP地址)的通信多路復(fù)用,所以當(dāng)一個Web網(wǎng)站上使用多個域名下的資源,改善效果就會受到限制。
使用瀏覽器進(jìn)行全雙工通信的WebSocket
利用Ajax和Comet技術(shù)進(jìn)行通信可以提升Web的瀏覽速度。但若使用HTTP協(xié)議,就無法徹底解決瓶頸問題,WebSocket真是為解決這些問題而實(shí)現(xiàn)的一套新協(xié)議及API。
WebSocket曾計劃將其作為HTML5標(biāo)準(zhǔn)的一部分,而它逐漸變成了獨(dú)立的協(xié)議標(biāo)準(zhǔn)。在2011年被正式定為標(biāo)準(zhǔn)。
一旦Web服務(wù)器與客戶端之間建立起WebSocket協(xié)議的通信連接,不論哪方都可以直接向?qū)Ψ桨l(fā)送報文。
WebSocket功能:
- 推送功能
支持服務(wù)器向客戶端推送數(shù)據(jù)。 - 減少通信量
只要建立起WebSocket連接,就一直保持連接狀態(tài)。減少了每次連接的開銷。此外,WebSocket的首部信息很小,通信量也相應(yīng)減少了。
為建立WebSocke通信,需要完成一次“握手”的步驟,這次“握手”是通過HTTP實(shí)現(xiàn)的,需要用到HTTP的Upgrade首部字段,告知服務(wù)器通信協(xié)議發(fā)生改變。對于該請求,服務(wù)器返回狀態(tài)碼101 Switching Protocols。成功握手建立WebSocket連接。