跳转至

引言

TCP 协议虽然是全双工的,但 HTTP 协议是半双工的,同一时间只能一端给另一端发数据

很多时候服务端需要向客户端主动发送数据,即推送,比如扫码登陆,很长一段时间都是通过定时轮询(特定时间向服务器请求数据)或长轮询等方式来实现的,但这些并不是真正意义上的推送,不仅浪费资源且效率低下。

这是由于当时设计时未考虑像网页游戏这样的场景,于是基于 TCP 的全双工协议 Websocket 伴随着 HTML5 应运而生。

使用 Websocket 协议需要先发送一个 HTTP 协议,请求头中带上特殊的字段,然后升级为 WS 协议

20240612192609

因此有人会说 Websocket 是建立在 HTTP 之上的,其实只是建立连接时用到了 HTTP,升级到 WS 后便与 HTTP 没有任何关系了

Websocket 完美继承了 TCP 的全双工能力,又解决了粘包问题,适用于客户端与服务器频繁交互的大部分场景,比如网页聊天室、网页或小程序游戏、证券交易等

其优点如下:

  • 不需要多次创建 TCP 请求和销毁,节约宽带和服务器的资源
  • 数据格式比较轻量,性能开销小,通信高效
  • 可以发送文本,也可以发送二进制数据
  • 没有同源限制,客户端可以与任意服务器通信

WebSocket 与 HTTP 协议有着良好的兼容性,使用相同的TCP端口,即 80443

WSS(Web Socket Secure)是 WebSocket 的加密版本,WSS 下不支持 ip 地址的写法,需要写成域名形式

  • 请求

20240410233609

  • 返回

20240410233621