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持久连接,双发已经能够随时向对方发送消息。

相关文章
相关标签/搜索