Python:Tornado 第三章:HTML5 WebSocket概念及應用:第一節:WebSocket概念

上一篇文章: Python:Tornado 第二章:實戰演練:開發Tornado網站:第九節:防止跨站攻擊
下一篇文章: Python:Tornado 第三章:HTML5 WebSocket概念及應用:第二節:服務端編程

Tornado的異步特性使得其很是適合服務器的高併發處理,客戶端與服務器的持久鏈接應用框架就是高併發的典型應用。而WebSocket正是在HTTP客戶端與服務器之間創建持久鏈接的HTML5標準技術。本章將講解WebSocket技術在Tornado框架中的應用。
WebSocket protocol是HTML5定義的一種新的標準協議(RFC6455),它實現了瀏覽器與服務器的雙全工通訊(full-duplex)。web

一、WebSocket的應用場景

傳統的HTTP和HTML技術使用客戶端主動向服務器發送請求並獲取回覆。可是隨着即時通信需求的增多,這樣的通訊模式有時並不能知足應用的需求。編程

WebSocket與普通的Socket通信相似,它打破了原來HTTP的Request和Response一對一的通訊模型,同時打破了服務器只能被動地接受客戶端請求的應用場景。也許讀者據說過Ajax、Long poll等基於傳統HTTP的動態客戶端技術,但這些技術無不採用輪詢技術,耗費了大量的網絡帶寬和計算資源。segmentfault

而WebSocket正是爲了應對這樣的場景而制定的HTML5標準,相對於普通的Socket通訊,WebSocket又在應用層定義了基本的交互流程,使得Tornado這樣的服務器框架和JavaScript客戶端能夠構建出標準的WebSocket模塊。瀏覽器

總結WebSocket的特色以下:服務器

  • WebSocket適合服務端主動推送的場景。
  • 相對於Ajax和Long poll等技術,WebSocket通訊模型更高效。
  • WebSocket仍然與HTTP完成Internet通訊。
  • 由於是HTML5的標準協議,因此不受企業防火牆的攔截。

二、WebSocket的通訊原理

WebSocket的通訊原理是在客戶端與服務器之間創建TCP持久連接,從而使得當服務器有消息須要推送給客戶端時可以進行即時通訊。websocket

雖然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持久連接,雙發已經能夠隨時向對方發送消息。

相關文章
相關標籤/搜索