WebSocket用来客户端和服务端双向通信,通常情况下客户端只建立一个连接,而服务器可以同时与多个客户端建立连接。

WebSocket协议

websocket协议可分为两个部分:握手数据传输

握手

WebSocket复用了HTTP的握手通道。具体指的是,客户端通过HTTP请求与WebSocket服务端协商升级协议。协议升级完成后,后续的数据交换则遵照WebSocket的协议。

  1. 客户端通过向服务端指定的URI发送HTTP请求开启握手。该信息与HTTP协议兼容(服务器将该信息认为是升级版的的HTTP协议)

    1. GET /path/to/websocket/endpoint HTTP/1.1
    2. Host: localhost
    3. Upgrade: websocket
    4. Connection: Upgrade
    5. Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
    6. Origin: http://localhost
    7. Sec-WebSocket-Version: 13

    Upgrade:websocket表示协议升级为websocket

  2. 服务器的握手应答:

    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
    
  3. 判断握手成功

客户端->服务端一个key,服务端将key通过加密返回给客户端一个accept,然后客户端会利用同样的方法算一下本地的accept,然后和接收到的进行对比,如果相同则握手成功。

数据传输

  1. websocket协议中数据是通过一系列的帧来传输。出于安全性考虑,所有客户端发往服务器的数据帧需要掩码,若服务器收到未掩码的数据帧将会主动断开连接;所有服务器发往客户端的数据帧不能掩码,若客户端收到掩码的数据帧将会主断开连接。
  2. 支持文本信息(utf-8)和二进制信息。

    控制帧

  3. close:服务器和客户端都可以发送close帧请求断开连接。

  4. ping/pong:服务器发送ping去尝试客户端是否在线(客户端以pong作为应答)

    URI

    ws://host:port/path?query
    wss://host:port/path?query
    
  5. ws表示不安全连接,wss表示安全连接

  6. ws的默认端口为80,wss的默认端口为443
  7. path是server的endpoint路径