淺談Websocket、Ajax輪詢和長輪詢(long p0ll)
最近看到了一些介紹Websocket的文章,覺得挺有用,所以在這里將自己的對其三者的理解記錄一下。
1.什么是Websocket
Websocket是HTML5中提出的新的協議,注意,這里是協議,可以實現客戶端與服務器端的通信,實現服務器的推送功能。
2.Websocket和HTTP協議是什么關系
簡單來說,Websocket和HTTP有關系,但是關系不大,它們的關系類似於數學中的交集,如下圖(借用的Ovear的圖)。Websocket借用了HTTP協議來完成一部分握手過程。

3.Websocket的握手過程
當客戶端要建立Websocket連接時,其向服務器發送:
GET /chat HTTP/1.1
Host: xxx.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://xxx.com
其中,Upgrade: websocket和Connection: Upgrade告訴服務器,我要建立的是websocket連接;Sec-WebSocket-Key部分服務器加密后還要返回瀏覽器,確保建立的是websocket連接;Sec-WebSocket-Version: 13是websocket的版本號。
當服務器接收到上述包后,會返回一下內容:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
它告訴客戶端,我已經切換到websocket協議了,Sec-WebSocket-Accept就是Sec-WebSocket-Key加密后的內容,這樣,一個websocket連接就建立了。
4.Websocket怎么工作的
客戶端:我要建立websocket連接
服務器端:好的,已經切換到websocket協議,websocket連接已經建立
客戶端:有什么消息要及時告訴(
推送)我
服務器端:好的
服務器端:xxxxxx
服務器端:yyyyyyy
。。。。。
其優點就是,只要建立一次連接,就可以連續不斷的得到服務器推送的消息,節省帶寬和服務器端的壓力。
5.Ajax輪詢怎么實現的
其實,這個大多數小伙伴都知道了,ajax輪詢模擬長連接就是每個一段時間(0.5s)就向服務器發起ajax請求,查詢服務器端是否有數據更新
客戶端:有沒有新消息
服務器端:沒有。。
客戶端:有沒有新消息
服務器端:有,xxxxx
客戶端:有沒有新消息
服務器端:沒有。。
客戶端:有沒有新消息
服務器端:沒有。。
。。。。。。
其缺點顯而易見,每次都要建立HTTP連接,即使需要傳輸的數據非常少,所以這樣很浪費帶寬;同時,這個過程是被動性的,即不是服務器主動推送的。
6.長輪詢(long poll)
客戶端:有沒有新信息(Request)
服務端:沒有,
服務端:沒有,
(時間一直的流逝。。。,當等待到有消息的時候)
服務器端:給你xxxx(Response)
客戶端:有沒有新消息(Request)
。。。。。
其缺點也是顯而易見的,同ajax輪詢一樣,也是每次都要建立HTTP連接,也都是被動的。而且這種方法對服務器的並行要求比較大,因為在沒有消息的時候,連接照樣保持,而這時需要其它信息是又要建立新的連接(就連接保持中)。
7.參考:
a.百度
b.http://www.zhihu.com/question/20215561/answer/40316953
b.http://www.zhihu.com/question/20215561/answer/40316953
