毋庸讳言,WebSocket主要用于定义实现全双工的通信协议,并且web浏览器和web服务器都必须支持WebSocket协议,以便让web浏览器和web服务器能够实现相互间的实时通信。浏览器和服务器之间建立好初始连接后就形成了socket式的通信WebSocket

目前在浏览器中通过HTTP协议只能实现单向通信,Coment可以在一定程度上实现双向通信,但效率较低,并且需要服务器有较好的支持,Flash中的SocketXMLSocket可以实现真正的双向通信,通过Flex Ajax Bridge,可以在JavaScript中使用flash的这两项功能。我认为WebSocket将会替代以上两种技术。

以下我总结了一下HTTP在通信上的问题。

1,每一位客户到服务器消息都有一个HTTP首部,无论上一次连接是否已经确认。

2,客户端难以保证从服务器端返回的连接一定能够维持住。实际上非常麻烦,而且消耗的资源很大。

3,服务器端必须为每一个连接的HTTP请求消耗足够的资源,并对发出的消息进行响应。

4,附加延伸问题:这种通信方式在前期解决了很多问题,但随着时代的发展,这种通信模式给全世界的互联网带来了巨大的噪声,增加了很多不必要的通信消耗,浪费了宽带资源,既不节能,又不环保。

WebSocket协议和WebSocket API结合,组成了WebSocket的理论和实践两部分。WebSocket不是标准Socket协议,它在OSI七层模式中处于处于上层,基于HTTP,而HTTP协议是TCP协议的一部分。下面我从特性,工作原理等方面来谈谈WebSocket协议的相关内容。

其特性有:有状态,速度,双向通信,长轮询。其工作原理:浏览器或客户端通过80或者443端口与服务器进行请求握手,服务器根据HTTP首部是不是WebSocket请求,如果是,则请求升级为一个WebSocket连接,握手成功后进入双向长连接的数据传输阶段。客户端通过WebSocket与服务端进行通信时,只有第一次握手交互的信息比较复杂,在握手成功后便进入双向长连接的数据传输阶段,此时传输的几乎只是纯数据,性能很高。WebSocket协议看起来更像TCPSocket协议,但它的定位却是HTTP1.1,是HTTP协议的一个增强升级,因此具备了HTTP协议的很多优点,例如兼容HTTP反向代理等。其通信模式为帧通信。格式以0x00表示数据开始,0xFF表示数据结束。以UTF-8编码。

WebSocket的通信模式:传统的HTTP都是基于请求响应模型的,客户端和服务器端无法实现实时通信,之前也有仿实时通信的技术,但从轮询,长轮询到Coment都不能彻底解决实时通信的问题。WebSocket的出现改变了这一现状,大幅度减少了通信中无用的消息首部极大地提高了通信效率,同时也提供了非常低的延时。构造了WebSocket的消息首部后,客户端必须按照如下7个步骤产生通信。

1,解析WebSocketURL地址,获取主机,端口,资源名称,安全模式。(如果连接不成功,则返回一个SYNTAX_ERR异常终止执行。)

2,检查端口是否被占用。(如果发起端口已经被占用,则抛出一个SECURUTY_ERR异常并终止执行。一般80443都不会被封锁。)

3,如协议不被浏览器支持,则协议会被设为一个空数组。

4,如果在通信过程中,有任何字符的Unicode码值小于U+0021或大于U+007E(换而言之,有空字符或任意不能显示的ASCII),都将报错SYNTAX_ERR异常,同时断开通信步骤.

5,WebSocket构造器脚本先使源变成序列化的ASCII,然后再转换成ASCII码的下标格式.

6,返回一个新的WebSocket对象,并在后台继续这些动作(不锁死脚本)

7,建立一个到指定主机端口的WebSocket连接,该连接从源起一个带着安全认证,源主机名称,协议表(可能为空)和遵守cookie旗标设置的连接请求。

总而言之:WebSocket是一个足够简单的通信协议,它可以实现基于TCP连接的双向通信。WebSocket技术可以用于各种网络应用,如游戏,股票行情,多用户应用程序,实时编辑,聊天室,远程教育,远程桌面和远程控制等。没准在不远的将来,还会出现在web端未出现的各种应用。

附:

     客户端到服务端的响应代码

   

     From client to server:

     GET /demo HTTP/1.1

     Host:example.com

     Connection:Upgrade

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

     Sec-WebSocket-Protocol:sample

     Upgrade:WebSocket

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

     Origin:HTTP://example.com

     [8-byte security key]


     服务端到客户端的响应代码

     From server to client:

     HTTP/1.1 101 WebSocket Protocol Handshake

     Upgrade:WebSocket

     Connection:Upgrade

     WebSocket-Origin:HTTP://example.com

     WebSocket-Location:ws://example.com/demo

     WebSocket-Protocol:sample

     [16-byte hash response]