WebSocket 知识整理

1,699 阅读3分钟
WebSocket 实现了客户端与服务器之间的长连接,这样服务器可以主动推送消息给客户端,有非常丰富的使用场景。如果没有 Websocket 协议,要想实现长连接,就需要采用 Comet 的方式,这种方式就是采用客户端定时 http 轮询或者 iframe 流,以此来保证一个长连接。

Comet 的缺点:

  • 客户端与服务器采用的还是 http 协议,双方需要频繁地通讯,这样对于服务器来说性能损耗很大。
  • http 协议来做为长连接,网路传输效率相对较低。

WebSocket 协议介绍:

Websocket 协议主要分为两个部分:握手和数据传输。特别要提到的是,WebSocket 在握手阶段使用的是 http 协议.


WebSocket 握手


  1. 客户端建立连接时,通过 http 发起请求报文。在请求头中,会有如下这些报文,Sec-WebSocket-Key 用于安全校验,Sec-WebSocket-Key 的值是随机生成的 base64 编码字符串。
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: 字符串
# 指定子协议和版本号
Sec-WebSocket-Protocol: chat, superchat 
Sec-WebSocket-Version: 13
  1. 服务器收到字符串以后,与服务器生成的字符串相连接,形成新的字符串,然后新的字符串会进行 sha1 散列算法和 base64 编码,最后返回给客户端.
  2. 服务端处理完成以后,生成相应报文。报文告知客户端更新应用层协议为 WebSocket 协议。
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 字符串
Sec-WebSocket-Protocol: chat
  1. 客户端接收到服务端的响应报文以后,会对 Sec-WebSocket-Key 进行校验,校验成功以后,会开始数据传输。

WebSocket 与 http 协议的比较优势:


  • 客户端与服务端只需要建立一个 tcp 连接。
  • WebSocket 服务端可以主动推送数据到客户端,这比 http 的请求相应模式更有优势。
  • WebSocket 的协议头更轻量,减少了不必要的数据传输。

WS 和 WSS


WebSocket 可以使用 ws 或 wss 来作为统一资源标志符,类似于 HTTP 或 HTTPS。其中 ,wss 表示在 TLS 之上的 WebSocket,相当于 HTTPS。默认情况下,WebSocket的 ws 协议基于Http的 80 端口;当运行在TLS之上时,wss 协议默认是基于Http的 443 端口。说白了,wss 就是 ws 基于 SSL 的安全传输,与 HTTPS 一样样的道理。所以,如果你的网站是 HTTPS 协议的,那你就不能使用 ws:// 了,浏览器会 block 掉连接,和 HTTPS 下不允许 HTTP 请求一样.

  • 如果你的服务是基于 https的, 那么客户端就需要使用 WSS 去进行连接。
  • 使用客户端使用 WSS 连接不能使用 IP 的方式,需要使用域名进行连接。
  • 使用 WSS 需要使用 https 连接,这并不是协议本身的限制,实际上是由于低版本谷歌浏览器和 firefox 浏览器的安全机制造成的。

Socket.io

这个库,针对客户端和服务端使用 WebSocket 分别进行了封装,提供了简洁方便的 API。

WebSocket 的项目场景


很多朋友可能有丰富的技术知识基础,但是缺少对技术使用场景的了解,这里我分享几个我做过涉及到 WebSocket 的项目。

  • 数据大屏:通过 WebSocket 可以实现实时数据大屏,在数据发生改变时,主动通知前端页面,进行数据展示的更新;
  • 聊天室:使用 Socket.io 可以非常方便地创建聊天室;
  • H5 小游戏;