这些关于WebSocket的知识,你知道多少?

2,125 阅读6分钟

关于对WebSocket的一些介绍

什么是WebSocket

WebSocket protocol 是HTML5 一种新的协议。
它是实现了浏览器与服务器全双工通信。
HTML5定义了WebSocket 协议,能更好的节省服务器资源和带宽并达到实时通讯。

问什么会使用WebSocket

HTML页面在刚刚开始出现的时候是静态的,不能够进行交互。
直到后来有了JavaScript ,在一定程度上解决了这个问题,但是JavaScript 刚出现的时候并不能和服务器进行交互。
直到Ajax 的出现,Ajax 有效的解决了页面和服务器段进行交互的问题。不过Ajax 有一个问题,就是所有的请求都必须由客户端发起,服务端进行响应,如果服务器端有最新的消息,难以即时的发送到客户端上去。
在WebSocket 技术出现之前,为了让客户端能够即时的活服务端的数据,采用了如下三种方案。

轮询

这是最简单的一种解决方案,也就是客户端在固定的时间间隔下(一般是1秒)不停的向服务器端发送请求,查看服务器端是否有最新的数据,服务器端如果有最新的数据,则返回给客户端。如果服务端没有,则返回一个空的json 或者xml 文档。

这种实现方式看起来很简单,但是弊端也很明显,就是会有大量的无效请求,服务端的资源被大大的浪费了。

长连接

长连接和轮询有些许类似,不同的是服务端不是每次都会响应客户端的请求,只有在服务器有最新数据的时候才会响应客户端的请求。

这种方式很明显会节省网络的资源和服务器资源,但是也会存在一些问题:

  1. 如果浏览器在服务器响应之前有新数据要发送就只能创建一个新的并发请求,或者先尝试断掉当前请求然后再创建新的请求。
  2. TCP 和HTTP 规范中都有可能出现连接超时的情况,所以所谓的长连接并不能一直持续,服务端和客户端的连接需要定期的连接和关闭再连接。

Applet和Flash

这两个技术除了可以让我们的HTML 页面更加绚丽之外,还可以解决消息推送的问题。开发者可以用一个像素嗲大小的普通透明的Apple 或者Flash ,然后将之内嵌在页面中,然后这个Applet 或者Flash 中的代码创建出一个Socket 连接,这种连接方式消除了HTTP协议中的各种限制。
当服务器有消息发送到客户端的时候,开发者可以在Applet 或者Flash中调用JavaScript 函数,然后更新页面。
当浏览器有数据要发送给服务器的时候也一样,通过Applet 或者Flash 来传递。

这种方式真正的实现了全双工通信,但是也存在问题:

  1. 浏览器必须能够运行Java 或者Flash
  2. 无论是Applet 还是Flash 都存在安全问题
  3. 随着HTML5 标准在浏览器中广泛支持,Flash下架已经被提上日程

WebSocket

引入

通过在客户端在请求头HTTPConnection : Upgrade 来希望升级协议。

通过Upgrade 头中指定一个或者多个协议的列表(这些协议必须兼容HTTP/1.1)。

在服务器收到请求之后,如果接受升级请求,将会返回一个101的状态码,表示转换请求协议同时相应Upgrade头中时通 ‘单个值’,这个单个值就是请求协议列表中服务器支持的第一个协议。
通过各种各样的协议从而创建不同的TCP通信。浏览器并不会让开发者随意去这么做,而是要制定某些协议,就这样webSocket应运而生!

使用HTTP/1.1升级的WebSocket

一个WebSocket请求首先使用正常的HTTP请求以特定的模式访问一个URL,这个URL 有两种模式,分别是ws 和 wss 对应HTTP协议中的http 和https 。
请求头中除了Connection : Upgrade 之外还有一个 Upgrade : websocket,它们两个将共同告诉服务器将连接升级为WebScket 这样的全双工协议。
如此,在握手完成之后,文本消息或者其他二进制消息就可以同时在两个方向上进行发送,而不需要关闭和重建连接,此时的客户端和服务端关系其实是对等的,它们都可以相互想对方主动发消息。

这里需要注意:
ws 和wss 模式并不能算作HTTP协议的一部分,因为HTTP请求和请求头并不包含URL模式,HTTP请求只能在请求的第一行中包含相对与服务器的URL,在Host头中包含域名,而WebSocket中特有的ws 和wss 模式主要用于通知浏览器和API 是希望使用SSL/TSL(wss) ,还是希望使用不加密的方法(ws)进行连接。

WebSocket协议的优势

  1. 由于WebSocket连接在端口80(ws) 或者443(wss) 上创建,与HTTP使用的端口相同,这样,基本上所有的防火墙都不会阻塞WebSocket 连接。
  2. WebSocket使用HTTP 协议进行握手,因此它可以自然而然的集成到网络浏览器和HTTP 服务器中。
  3. 心跳检测(ping、pong)将会反复的发送,进而保持WebSoket连接几乎一直出于活跃状态。
    一般来说是这样,一个节点周期性的发送一个小数据包到另一个节点(ping),而另一个节点则使用了包含了相同数据的数据包作为响应(pong),这样两个节点都处于连接状态。
  4. 使用该协议,当消息启动或者到达的时候,服务器和客户端都可以知道。
  5. WebSocket连接关闭时将发送一个特殊的关闭消息。
  6. WebSocket支持跨域,可以避免Ajax的限制。
  7. HTTP规范要求浏览器将并发连接数限制为每个主机名两个连接,但是当我们使用了WebSocket的时候,当握手完成之后该限制就不存在了,因为此时的连接已经不再是HTTP。

WebSocket协议的用途

  1. 网页上的在线聊天
  2. 多人在线游戏
  3. 在线股票网站
  4. 在线即时新闻网站
  5. 高清视频流
  6. 应用集群之间的通信
  7. 远程系统/软件的状态和性能的实时监控

本文参考资料 : 《JaveEE编程》