WebSocket
实现即时通讯(全双工)的传统方案主要有 轮询
, 长轮询
, applet和Flash
轮询
客户端在固定的时间间隔下不停的向服务端发送请求,查看服务器是否有新的数据,若服务段有新的数据则返回给客户端,若没有数据则返回一个空文档,但是弊端特别明显,需要消耗极大的资源,服务器需要处理很多无效的HTTP请求
长轮询
在长轮询中浏览器向服务器发送请求后,服务器在没有要返回的数据时不进行返回,而是持有连接等到有数据返回的时候才进行返回,这种方式在一定程度上可以减少网络资源与服务器资源,但也存在一定问题,如果浏览器在服务器响应之前有新数据要发送,只能创建一个并发请求,或者先尝试断开当前请求,在创建新请求, TCP 和 HTTP 规范中都有链接超时,这就导致所谓的长连接不能一直连接服务端和客户端需要定期连接和关闭连接
Applet 和 Flash
applet 和 flash 都已经被淘汰,虽然他们支持原生的socket连接,但是使用也很受限制,浏览器必须支持applet 和 flash , applet 都有安全问题.
WebSocket 连接
是一种在单个TCP连接上进行全双工通信的协议,已被W3C 定义为规范,使用WebSocket 可以使客户端和服务器之间的数据交换更加简单,它允许服务器直接向客户端发送数据,在WebSocket 中浏览器和服务器只需完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输
特点
-
建立在 TCP 协议之上,服务器端的实现比较容易。
-
与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
-
数据格式比较轻量,性能开销小,通信高效。
-
可以发送文本,也可以发送二进制数据。
-
没有同源限制,客户端可以与任意服务器通信。
-
协议标识符是
ws
(如果加密,则为wss
),服务器网址就是 URL。 -
WebSocket 是独立的、创建在 TCP 上的协议。
-
Websocket 通过HTTP/1.1 协议的101状态码进行握手。
优点
-
较少的控制开销。在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。在不包含扩展的情况下,对于服务器到客户端的内容,此头部大小只有2至10字节(和数据包长度有关);对于客户端到服务器的内容,此头部还需要加上额外的4字节的掩码。相对于HTTP请求每次都要携带完整的头部,此项开销显著减少了。
-
更强的实时性。由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少;即使是和Comet等类似的长轮询比较,其也能在短时间内更多次地传递数据。
-
保持连接状态。与HTTP不同的是,Websocket需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。
-
更好的二进制支持。Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。
-
可以支持扩展。Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。
-
更好的压缩效果。相对于HTTP压缩,Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率。
-
支持跨域,可以避免Ajax限制
握手方式
WebSocket 使用了 HTTP/1.1 的协议升级特性 ,一个WebSocket 首先以特定的模式访问一个URL (这个模式有ws和 wss 分别对应 HTTP 和HTTPS ) 在请求头中有一个字段 Connection:Upgrade
字段表示客户点想要升级协议 ,另外还有一个 Upgrade:websocket
字段 表示客户端想要升级协议为WebSocket,如果服务器同意了协议升级那么在握手完成后,websocket将建立,文本消息和二进制消息将在两个方向上同时传送