WebSocket

目标

WebSocket 规范的目标是在浏览器中实现和服务器端双向通信.双向通信可以拓展浏览器上的应用类型,例如实时的数据推送(股票行情),游戏,聊天/im 等.

背景

目前在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双向通信,但效率较低,并需要服务器有较好的支持; flash中的socket和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使用这两项功能. 可以预见,如果websocket一旦在浏览器中得到实现,将会替代上面两项技术,得到广泛的使用.面对这种状况,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并达到实时通讯。

原理

websocket规范由两部分组成,一部分是浏览器中的 websocket api, 由w3c 制订, 一部分是websocket 协议, 由ietf制订,目前是draft状态.websocket的协议比较简单, 客户端和普通的浏览器一样通过80或者443端口和服务器进行请求握手,服务器根据http header识别是否一个websocket请求,如果是,则将请求升级为一个websocket连接,握手成功后就进入双向长连接的数据传输阶段. websocket的数据传输是基于帧的方式: 0x00 表示数据开始, 0xff表示数据结束,数据以utf-8编码.

握手协议

在实现websocket连线过程中,需要通过浏览器发出websocket连线请求,然后服务器发出回应,这个过程通常称为“握手” (handshaking)。

  PS1:握手协议在后期的版本中,会标明版本编号,下面的例子属于早期的协定之一,对于新版的 chrome 和 Firefox 皆不适用。

  PS2:后期的版本大多属于功能上的扩充,例如使用第7版的握手协议同样也适用于第8版的握手协议。

  例子:

  浏览器请求

  GET /demo HTTP/1.1

  Host: 你的网址.com

  Connection: Upgrade

  Sec-WebSocket-Key2: 12998 5 Y3 1 .P00

  Sec-WebSocket-Protocol: sample

  Upgrade: WebSocket

  Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5

  Origin: http://你的网址.com

  ^n:ds[4U

  服务器回应

  HTTP/1.1 101

  WebSocket Protocol Handshake

  Upgrade: WebSocket

  Connection: Upgrade

  Sec-WebSocket-Origin: http://你的网址.com

  Sec-WebSocket-Location: ws://你的网址.com/demo

  Sec-WebSocket-Protocol: sample

  8jKS’y:G*Co,Wxa-

浏览器

目前实现了websocket的浏览器:

  

Chrome

Supported in version 4+

Firefox

Supported in version 4+

Internet Explorer

Supported in version 10+

Opera

Supported in version 10+

Safari

Supported in version 5+

服务器

在服务器端,也出现了一些实现websocket协议的项目:

  jetty7.0.1 包含了一个初步的实现

  resin 包含有websocket 实现

  pywebsocket, apache http server 扩展

  apache tomcat 7.0.27 版本

  websocket api在浏览器端的广泛实现似乎只是一个时间问题了, 值得注意的是目前服务器端没有标准的api, 各个实现都有自己的一套api, 并且jcp也没有类似的提案, 所以使用websocket开发服务器端有一定的风险.可能会被锁定在某个平台上或者将来被迫升级.

你可能感兴趣的:(websocket)