淺談Websocket、Ajax輪詢和長輪詢(long p0ll)web
最近看到了一些介紹Websocket的文章,以爲挺有用,因此在這裏將本身的對其三者的理解記錄一下。ajax
1.什麼是Websocket瀏覽器
Websocket是HTML5中提出的新的協議,注意,這裏是協議,能夠實現客戶端與服務器端的通訊,實現服務器的推送功能。服務器
2.Websocket和HTTP協議是什麼關係websocket
簡單來講,Websocket和HTTP有關係,可是關係不大,它們的關係相似於數學中的交集,以下圖(借用的Ovear的圖)。Websocket借用了HTTP協議來完成一部分握手過程。socket
3.Websocket的握手過程加密
當客戶端要創建Websocket鏈接時,其向服務器發送:blog
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