了解 WebSocket

184 阅读5分钟

什么是 WebSocket?

WebSocket 诞生的背景

早期,很多网站为了实现推送技术,所用的技术都是轮询。轮询是指由浏览器每隔一段时间向服务器发出 HTTP 请求,然后服务器返回最新的数据给客户端。常见的轮询方式分为轮询与长轮询。

这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而 HTTP 请求与响应可能会包含较长的头部,其中真正有效的数据可能只是很小的一部分,所以这样会消耗很多带宽资源。

比较新的轮询技术是 Comet。这种技术虽然可以实现双向通信,但仍然需要反复发出请求。而且在 Comet 中普遍采用的 HTTP 长连接也会消耗服务器资源。

在这种情况下,HTML5 定义了 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。WebSocket 使用 ws 或 wss 的统一资源标志符(URI),其中 wss 表示使用了 TLS 的 WebSocket。

ws://echo.websocket.org
wss://echo.websocket.org\

WebSocket 介绍

来自维基百科的解释:WebSocket 是一种网络传输协议, 可在单个 TCP 连接上进行全双工通信,位于 OSI 模型的应用层。WebSocket 协议在 2011 年由 IETF 标准化为 RFC 6455,后由 RFC 7936 补充规范。Web IDL 中的 WebSocket API 由 W3C 标准化。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。

WebSocket 是一种与 HTTP 不同的协议。两者都位于 OSI 模型的应用层,并且都依赖于传输层的 TCP 协议。虽然它们不同,但 RFC 6455 规定:WebSocket 设计为通过 80 和 443 端口工作,以及支持 HTtP 代理和中介,从而使其与 HTTP 协议兼容。为了实现兼容性,WebSocket 握手使用 HTTP Upgrade 头从 HTTP 协议更改为 WebSocket 协议。

WebSocket 协议支持 Web 浏览器(或其他客户端应用程序)与 Web 服务器之间的交互,具有较低的开销,便于实现客户端与服务器的实时数据传输。服务器可以通过标准化的方式来实现,而无需客户端首先请求内容,并允许消息在保持连接打开的同时来回传递。通过这种方式,可以在客户端和服务器之间进行双向持续交互。通信默认通过 TCP 端口 80 或 443 完成。

大多数浏览器都支持该协议,包括 Google Chrome、Firefox、Safari 、Microsoft Edge 、Internet Explorer 和 Opera。

与 HTTP 不同,WebSocket 提供全双工通信。此外,WebSocket 还可以在 TCP 之上启用消息流。TCP 单独处理字节流,没有固有的消息概念。在 WebSocket 之前,使用 Comet 可以实现全双工通信。但是 Comet 存在 TCP 握手和 HTTP 头的开销,因此对于小消息来说效率很低。WebSocket 协议旨在解决这些问题。

WebSocket 协议规范将 Ws(WebSocket)和 wss (WebSocket Secure)定义为两个新的统一资源标识符(URI) 方案,分别对应明文和加密连接。除了方案名称和片段 ID (不支持#)之外,其余的 URI 组件都被定义为此 URI 的通用语法。

WebSocket 的优点

较少的控制开销:在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。在不包含扩展的情况下,对于服务器到客户端的内容,此头部大小只有 2 至 10 字节(和数据包长度有关);对于客户端到服务器的内容,此头部还需要加上额外的 4 字节的掩码。相对于 HTTP 请求每次都要携带完整的头部,此项开销显著减少了。

更强的实时性:由于协议是全双工的,所以服务器可以随时主动给客户端发下数据。相对于 HTTP 请求需要等待客户端发起请求服务端才能响应,延迟明显更少;即使是和 Comet 等类似长轮询比较,也能在短时间内更多次地传递数据。

保持连接状态: WebSocket 是一种有状态的协议,通信前需要先创建连接,之后的通信就可以省略部分状态信息了。而 HTTP 请求可能需要在每个请求头都携带状态信息(如身份验证等)。

更好的二进制支持: WebSocket 定义了二进制帧,相对 HTTP,可以更轻松地处理二进制内容。

可以支持扩展: WebSocket 定义了扩展,用户可以扩展协议、实现部分自定义的协议。如部分浏览器支持压缩等。

更好的压缩效果:相对于 HTTP 压缩,WebSocket 在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著的提高压缩率。

由于 WebSocket 拥有上述的优点,所以它被广泛地应用在即时通信、实时音视频、在线教育和游戏等领域。

相关文章推荐

WebSocket 教程-阮一峰