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


































