Tornado的非同步特性使得其非常適合伺服器的高並發處理,客戶端與伺服器的持久連接應用框架就是高並發的典型應用。而WebSocket正是在HTTP客戶端與伺服器之間建立持久連線的HTML5標準技術。本章將說明WebSocket技術在Tornado框架中的應用。
WebSocket protocol是HTML5定義的一種新的標準協定(RFC6455),它實作了瀏覽器與伺服器的雙全工通訊(full-duplex)。
1、WebSocket的應用程式場景
傳統的HTTP和HTML技術使用用戶端主動向伺服器發送請求並取得回應。但是隨著即時通訊需求的增多,這樣的通訊模式有時並不能滿足應用的需求。
WebSocket與普通的Socket通訊類似,它打破了原來HTTP的Request和Response一對一的通訊模型,同時打破了伺服器只能被動地接受客戶端請求的應用場景。也許讀者聽過Ajax、Long poll等基於傳統HTTP的動態用戶端技術,但這些技術無不採用輪詢技術,耗費了大量的網路頻寬和運算資源。
而WebSocket正是為了應對這樣的場景而製定的HTML5標準,相對於普通的Socket通信,WebSocket又在應用層定義了基本的交互流程,使得Tornado這樣的伺服器框架和JavaScript客戶端可以建構出標準的WebSocket模組。
總結WebSocket的特點如下:
WebSocket適合服務端主動推送的場景。
相對於Ajax和Long poll等技術,WebSocket通訊模型更有效率。
WebSocket仍然與HTTP完成Internet通訊。
因為是HTML5的標準協議,所以不受企業防火牆的攔截。
2、WebSocket的通訊原理
WebSocket的通訊原理是在客戶端與伺服器之間建立TCP持久鏈接,從而使得當伺服器有訊息需要推送給客戶端時能夠進行即時通訊。
雖然WebSocket不是HTTP,但由於在Internet上HTML本事是由HTTP封裝並進行傳輸的,所以WebSocket仍然需要與HTTP進行協作。 IETF在RFC6455中定義了基於HTTP連結建立WebSocket頻道的標準流程。
客戶端透過發送以下HTTP Request告訴伺服器需要建立一個WebSocket長連結頻道:
GET /stock_info/?encoding=text HTTP/1.1 Host:echo.websocket.org Origin:http://websocket.org Cookie:__token=ubcxx13 Connection:Upgrade Sec-WebSocket-Key:uRovscZjNol/umbTt5uKmw== Upgrade:websocket Sec-WebSocket-Version:13
讀者可以發現其仍然是一個HTTP Request包,並對其中的內容非常熟悉。
HTTP請求方式:GET
#請求位址:/stock_info
HTTP版本編號: 1.1
伺服器主機網域:echo.websocket.org
Cookie資訊:__token=ubcxx13
#但是在HTTP Header中出現了4個特色的字段,他們是:
Connection:Upgrade Sec-WebSocket-Key:uRovscZjNol/umbTt5uKmw== Upgrade:websocket Sec-WebSocket-Version:13
這就是WebSocket建立鏈路的核心,它告訴Web伺服器:客戶端希望建立一個WebSocket鏈接,客戶端使用的WebSocket版本時13,金鑰是uRovscZjNol/umbTt5uKmw==。
伺服器在收到該Request後,如果同意建立WebSocket連結則傳回類似如下的Response:
HTTP/1.1 101 WebSocket Protocol Handshake Date:Fri,10 Feb 2012 17:38:18 GMT Connection:Upgrade Server:Kaazing Gateway Upgrade:WebSocket Access-Control-Allow-Origin:http://websocket.org Access-Contril-Allow-Credentials:true Sec-WebSocket-Accept:rLHCKw/SKs09GAH/ZSFhBATDKrU= Access-Control-Allow-Headers:content-type
這依舊是一個標準的HTTP Response,其中與WebSocket相關的Header資訊是:
Connection:Upgrade Upgrade:WebSocket Sec-WebSocket-Accept:rLHCKw/SKs09GAH/ZSFhBATDKrU=
前面的兩個資料告訴客戶端:伺服器已經將本連線轉換為WebSocket連結。而Sec-WebSocket-Accept是將客服端發送的Sec-WebSocket-Key加密後產生的數據,以讓客服端確認伺服器能夠正常運作。
至此,在客戶端與伺服器之間已經建立了一個TCP持久鏈接,雙發已經可以隨時向對方發送訊息。
以上是Python的Tornado之WebSocket的概念以及應用介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!