WebSocket用来客户端和服务端双向通信,通常情况下客户端只建立一个连接,而服务器可以同时与多个客户端建立连接。
WebSocket协议
websocket协议可分为两个部分:握手 与 数据传输
握手
WebSocket复用了HTTP的握手通道。具体指的是,客户端通过HTTP请求与WebSocket服务端协商升级协议。协议升级完成后,后续的数据交换则遵照WebSocket的协议。
客户端通过向服务端指定的URI发送HTTP请求开启握手。该信息与HTTP协议兼容(服务器将该信息认为是升级版的的HTTP协议)
GET /path/to/websocket/endpoint HTTP/1.1Host: localhostUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==Origin: http://localhostSec-WebSocket-Version: 13
Upgrade:websocket表示协议升级为websocket
服务器的握手应答:
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=判断握手成功
客户端->服务端一个key,服务端将key通过加密返回给客户端一个accept,然后客户端会利用同样的方法算一下本地的accept,然后和接收到的进行对比,如果相同则握手成功。
数据传输
- websocket协议中数据是通过一系列的帧来传输。出于安全性考虑,所有客户端发往服务器的数据帧需要掩码,若服务器收到未掩码的数据帧将会主动断开连接;所有服务器发往客户端的数据帧不能掩码,若客户端收到掩码的数据帧将会主断开连接。
-
控制帧
close:服务器和客户端都可以发送close帧请求断开连接。
ping/pong:服务器发送ping去尝试客户端是否在线(客户端以pong作为应答)
URI
ws://host:port/path?query wss://host:port/path?queryws表示不安全连接,wss表示安全连接
- ws的默认端口为80,wss的默认端口为443
- path是server的endpoint路径
