WebSocket是什么原理?為什么能實(shí)現(xiàn)持久化連接?
為了更好的理解WebSocket,我們需要從HTTP開始說起。因?yàn)楹芏鄷r候,大家都喜歡拿WebSocket和HTTP做比較。
HTTP的生命周期,通過Request來界定,一個Request和一個Response,這次HTTP請求也就結(jié)束了。
在HTTP1.1中,允許發(fā)送多個Request和接收多個Response,但無論如何,Request永遠(yuǎn)等于Response。
很多網(wǎng)站為了實(shí)現(xiàn)實(shí)時的信息傳遞,都會使用輪詢技術(shù),輪詢有兩種,一種是ajax輪詢,一種是長輪詢(long poll)。
ajax輪詢的原理很簡單,讓瀏覽器每隔幾秒向服務(wù)器發(fā)送一次請求,詢問服務(wù)器是否有新的信息。
客戶端:有沒有新信息,沒有我等會再問(Request)
服務(wù)器:沒有(Response) 客戶端:有沒有,沒有我等會再問(Request) 服務(wù)器:沒有(Response) 客戶端:有沒有新信息,沒有我等會再問(Request) 服務(wù)器:有,發(fā)給你了(Response) |
長輪詢與ajax輪詢相似,不同的是,當(dāng)客戶端發(fā)起請求后,如果沒有消息,就一直不返回Response,直到有新消息為止。
客戶端:有沒有新信息,沒有不要回我(Request)
…… 服務(wù)器:現(xiàn)在有了,給你(Response) |
以上兩種方式,都在不斷地建立HTTP連接,只有客戶端發(fā)起請求時,服務(wù)端才能回應(yīng),服務(wù)端是不能主動發(fā)起的。
而且HTTP還是一個無狀態(tài)協(xié)議,服務(wù)器不會保留與客戶交易時的任何狀態(tài),這樣做的好處是大大減輕了服務(wù)器的記憶負(fù)擔(dān),保持較快的響應(yīng)速度。
不過因此也產(chǎn)生了一些問題。客戶端要不斷地發(fā)送HTTP請求,每次都要帶上較長的頭部,真正有效的數(shù)據(jù)可能很少,浪費(fèi)很多帶寬資源,也給服務(wù)器增加了壓力。
好了,我們的主角WebSocket終于可以登場了。
相對HTTP來說,WebSocket是一種持久化的協(xié)議。它會基于HTTP協(xié)議,來完成一部分握手,之后就脫離HTTP,完全采用WebSocket了。
建立WebSocket連接的過程為:
- 客戶端發(fā)起HTTP請求,經(jīng)過3次握手建立TCP連接,HTTP請求里存放WebSocket支持的版本號等信息。
- 服務(wù)器收到客戶端握手請求后,回饋數(shù)據(jù)。
以上兩個步驟完成后,HTTP握手部分完成,協(xié)議升級為WebSocket,此時服務(wù)器就不再需要客戶端發(fā)起請求,再響應(yīng)請求了,可以主動推送信息給客戶端了。
客戶端:我要建立WebSocket協(xié)議。
服務(wù)器:好的,已經(jīng)升級為WebSocket協(xié)議了。 客戶端:有信息的時候,推送給我。 服務(wù)器:好的,有信息會推給你。 服務(wù)器:有信息了,給你。 服務(wù)器:又有信息了,給你。 …… |
只需經(jīng)過一次HTTP請求,服務(wù)器就能源源不斷地向客戶端推送信息了!
從客戶端主動詢問,變成服務(wù)器主動推送,解決了服務(wù)器上資源消耗較多的問題。
以上便是WebSocket原理以及實(shí)現(xiàn)持久化連接的過程。