webkit HTML5 WebSocket 綜合分析 1

來源:互聯網
上載者:User

                                                                        csdn lidp  http://blog.csdn.net/perfectpdl

作為下一代的 Web 標準,HTML5 擁有許多令人信服的新特性,如 Canvas、本機存放區、多媒體編程介面、WebSocket 等等。這其中有“Web 的 TCP ”之稱的 WebSocket 格外吸引開發人員的注意。WebSocket 的出現使得瀏覽器提供對 Socket 的支援成為可能,從而在瀏覽器和伺服器之間提供了一個基於 TCP 串連的雙向通道,作為流行的開源瀏覽器引擎webkit
同樣支援此重量級html5特性。


即時 Web 應用程式的窘境

Web 應用程式的資訊互動過程通常是用戶端通過瀏覽器發出一個請求,伺服器端接收和審核完請求後進行處理並返回結果給用戶端,然後用戶端瀏覽器將資訊呈現出來,這種機制對於資訊變化不是特別頻繁的應用尚能相安無事,但是對於那些即時要求比較高的應用來說,比如說線上遊戲、線上證券、裝置監控、新聞線上播報、RSS 訂閱推送等等,當用戶端瀏覽器準備呈現這些資訊的時候,這些資訊在伺服器端可能已經過時了。所以保持用戶端和伺服器端的資訊同步是即時 Web 應用程式的關鍵要素,對 Web
開發人員來說也是一個難題。在 WebSocket 規範出來之前,開發人員想實現這些即時的 Web 應用程式,不得不採用一些折衷的方案,其中最常用的就是輪詢 (Polling) 和 Comet 技術,而 Comet 技術實際上是輪詢技術的改進,又可細分為兩種實現方式,一種是長輪詢機制,一種稱為流技術。下面我們簡單介紹一下這幾種技術:

輪詢:

這是最早的一種實現即時 Web 應用程式的方案。用戶端以一定的時間間隔向服務端發出請求,以頻繁請求的方式來保持用戶端和伺服器端的同步。這種同步方案的最大問題是,當用戶端以固定頻率向伺服器發起請求的時候,伺服器端的資料可能並沒有更新,這樣會帶來很多無謂的網路傳輸,所以這是一種非常低效的即時方案。

長輪詢:

長輪詢是對定時輪詢的改進和提高,目地是為了降低無效的網路傳輸。當伺服器端沒有資料更新的時候,串連會保持一段時間周期直到資料或狀態改變或者時間到期,通過這種機制來減少無效的用戶端和伺服器間的互動。當然,如果服務端的資料變更非常頻繁的話,這種機制和定時輪詢比較起來沒有本質上的效能的提高。

流:

流技術方案通常就是在用戶端的頁面使用一個隱藏的視窗向服務端發出一個長串連的請求。伺服器端接到這個請求後作出回應並不斷更新串連狀態以保證用戶端和伺服器端的串連不到期。通過這種機制可以將伺服器端的資訊源源不斷地推向用戶端。這種機制在使用者體驗上有一點問題,需要針對不同的瀏覽器設計不同的方案來改進使用者體驗,同時這種機制在並發比較大的情況下,對伺服器端的資源是一個極大的考驗。

綜合這幾種方案,您會發現這些目前我們所使用的所謂的即時技術並不是真正的即時技術,它們只是在用 Ajax 方式來類比即時的效果,在每次用戶端和伺服器端互動的時候都是一次 HTTP 的請求和應答的過程,而每一次的 HTTP 要求和應答都帶有完整的 HTTP 頭資訊,這就增加了每次傳輸的資料量,而且這些方案中用戶端和伺服器端的編程實現都比較複雜,在實際的應用中,為了類比比較真實的即時效果,開發人員往往需要構造兩個 HTTP 串連來類比用戶端和伺服器之間的雙向通訊,一個串連用來處理用戶端到伺服器端的資料轉送,一個串連用來處理伺服器端到用戶端的資料轉送,這不可避免地增加了編程實現的複雜度,也增加了伺服器端的負載,制約了應用系統的擴充性。


WebSocket 的拯救

HTML5 WebSocket 設計出來的目的就是要取代輪詢和 Comet 技術,使用戶端瀏覽器具備像 C/S 架構下案頭系統的即時通訊能力。 瀏覽器通過 JavaScript 向伺服器發出建立 WebSocket 串連的請求,串連建立以後,用戶端和伺服器端就可以通過 TCP 串連直接交換資料。因為 WebSocket 串連本質上就是一個 TCP 串連,所以在資料轉送的穩定性和資料轉送量的大小方面,和輪詢以及 Comet 技術比較,具有很大的效能優勢。


WebSocket 規範

WebSocket 通訊協定本質上是一個基於 TCP 的協議。為了建立一個 WebSocket 串連,用戶端瀏覽器首先要向伺服器發起一個 HTTP 要求,這個請求和通常的 HTTP 要求不同,包含了一些附加頭資訊,其中附加頭資訊”Upgrade: WebSocket”表明這是一個申請協議升級的 HTTP 要求,伺服器端解析這些附加的頭資訊然後產生應答資訊返回給用戶端,用戶端和伺服器端的 WebSocket 串連就建立起來了,雙方就可以通過這個串連通道自由的傳遞資訊,並且這個串連會持續存在直到用戶端或者伺服器端的某一方主動的關閉串連。

下面我們來詳細介紹一下 WebSocket 規範,由於這個規範目前還是處於草案階段,版本的變化比較快,我們選擇 draft-hixie-thewebsocketprotocol-76版本來描述 WebSocket 通訊協定。因為這個版本目前在一些主流的瀏覽器上比如 Chrome,、FireFox、Opera 上都得到比較好的支援,您如果參照的是新一些的版本話,內容可能會略有差別。

一個典型的 WebSocket 發起請求和得到響應的例子看起來如下:


清單 1. WebSocket 握手協議用戶端到服務端: GET /demo HTTP/1.1 Host: example.com Connection: Upgrade Sec-WebSocket-Key2: 12998 5 Y3 1 .P00 Upgrade: WebSocket Sec-WebSocket-Key1: 4@1 46546xW%0l 1 5 Origin: http://example.com [8-byte security key] 服務端到用戶端:HTTP/1.1 101 WebSocket Protocol Handshake Upgrade: WebSocket Connection: Upgrade WebSocket-Origin: http://example.com WebSocket-Location: ws://example.com/demo [16-byte hash response]


這些請求和通常的 HTTP 要求很相似,但是其中有些內容是和 WebSocket 通訊協定密切相關的。我們需要簡單介紹一下這些請求和應答資訊,”Upgrade:WebSocket”表示這是一個特殊的 HTTP 要求,請求的目的就是要將用戶端和伺服器端的通訊協議從 HTTP 協議升級到 WebSocket 通訊協定。從用戶端到伺服器端請求的資訊裡包含有”Sec-WebSocket-Key1”、“Sec-WebSocket-Key2”和”[8-byte securitykey]”這樣的頭資訊。這是用戶端瀏覽器需要向伺服器端提供的握手資訊,伺服器端解析這些頭資訊,並在握手的過程中依據這些資訊產生一個
16 位的安全密鑰並返回給用戶端,以表明伺服器端擷取了用戶端的請求,同意建立 WebSocket 串連。一旦串連建立,用戶端和伺服器端就可以通過這個通道雙向傳輸資料了。

在實際的開發過程中,為了使用 WebSocket 介面構建 Web 應用程式,我們首先需要構建一個實現了 WebSocket 規範的伺服器,伺服器端的實現不受平台和開發語言的限制,只需要遵從 WebSocket 規範即可,比如JWebSoket  ,其採用java語言實現 websocket伺服器端協議,並提供用戶端開發js介面。

下一篇分析 webkit 上 websocket js介面.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.