跳到主要内容

3.7-双向通信

Create by fall on 2021---- Recently revised in ----

WebSocket

浏览器与服务器进行全双工通讯的网络技术,应用协议,基于 TCP 传输协议,复用 HTTP 的握手通道。

WebSocket 本质上一种计算机网络应用层的协议,用来弥补 http 协议在持久通信能力上的不足。服务器也可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

  • 双向通信,实时性更强
  • 二进制支持
  • 控制开销少,创建后,WebSocket 客户端、服务端数据交互时,头部包小
  • 支持扩展,用户可以扩展协议

socket.iows 是经常用到的两个库,后者更加轻量

建立连接

WebSocket 复用了 HTTP 的握手通道,客户端通过 HTTP 请求与 WebSocket 服务端协商升级协议,协议升级完成后,数据交换遵循 WebSocket 协议

请求协议升级

请求头:

  • Connection:Upgrade 表示升级协议
  • Upgrade:websocket 表示升级协议到 websocket
  • Sec-WebSocket-Version:13 表示 websocket 的版本,如果服务器不支持该版本,服务器要返回该头,表示服务器支持的版本号
  • Sec-WebSocket-Key 与首部 Sec-WebSocket-Accept 配套,提供基本防护,恶意的链接,无意的链接

响应协议升级

状态码 101 表示协议切换,到此完成协议升级,自此之后的数据都按照新的协议来

HTTP/1.1 101 Switching Protocols
Connection:Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: Oy4NRAQ13jhfONC7bP8dTKb4PTU=

Sec-WebSocket-Accept

Sec-WebSocket-Accept 根据客户端请求首部的 Sec-WebSocket-Key 计算出来

计算公式为:

  • Sec-WebSocket-Key258EAFA5-E914-47DA-95CA-C5AB0DC85B11 拼接
  • 通过 SHA1(不知有没有更新为 SHA2)计算出摘要,并转成 base64

EventSource

等待补充

断开的原因

时间过久

服务端异常

参考文章

文章名称/作者链接
Gabyhttps://juejin.cn/post/7020964728386093093(还需补充
程序猿小卡https://juejin.cn/post/6844903544978407431