websocket 协议概述

Webscoket是Web浏览器和服务器之间的一种全双工通信协议,其中WebSocket协议由IETF定为标准,WebSocket API由W3C定为标准。一旦Web客户端与服务器建立起连接,之后的全部数据通信都通过这个连接进行。通信过程中,可互相发送JSON、XML、HTML或图片等任意格式的数据。

websocket是基于TCP的一个应用协议,与HTTP协议的关联之处在于websocket的握手数据被HTTP服务器当作HTTP包来处理,主要通过Update request HTTP包建立起连接,之后的通信全部使用websocket自己的协议。

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-------+-+-------------+-------------------------------+
 |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
 |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
 |N|V|V|V|       |S|             |   (if payload len==126/127)   |
 | |1|2|3|       |K|             |                               |
 +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
 |     Extended payload length continued, if payload len == 127  |
 + - - - - - - - - - - - - - - - +-------------------------------+
 |                               |Masking-key, if MASK set to 1  |
 +-------------------------------+-------------------------------+
 | Masking-key (continued)       |          Payload Data         |
 +-------------------------------- - - - - - - - - - - - - - - - +
 :                     Payload Data continued ...                :
 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
 |                     Payload Data continued ...                |
 +---------------------------------------------------------------+

Header

Sec-WebSocket-Protocol

Sec-WebSocket-Protocol报头指定了你希望使用的一个或多个WebSocket协议,按优先级排序。第一个被服务器支持的将被服务器选择并在响应中包含的Sec-WebSocket-Protocol头中返回。你也可以在头文件中使用它不止一次;结果与在单个报头中使用逗号分隔的子协议标识符列表相同。

需要WebSocket服务器实现了相关protocol,否则这个字段没什么用。


// socket.io-client
var socket = io({
    protocols: ["control"]
});

// 原生
var Socket = new WebSocket(url, [protocol]);

Sec-WebSocket-Version

  • 请求头
    指定客户端希望使用的WebSocket协议版本,以便服务器可以确认其端是否支持该版本。(一般不需要改动)
Sec-WebSocket-Version: version

version: 客户端与服务器通信时希望使用的WebSocket协议版本。这个数字应该是IANA WebSocket版本号注册表中列出的最新版本。 WebSocket协议的最新最终版本是版本13。

  • 响应头
    如果服务器不能使用指定版本的WebSocket协议进行通信,它将响应一个错误(例如426 Upgrade Required),该错误在其报头中包含一个Sec-WebSocket-Version报头,以及一个以逗号分隔的支持协议版本列表。如果服务器不支持请求的协议版本,则响应中不包含Sec-WebSocket-Version头。
Sec-WebSocket-Version: supportedVersions

supportVersions: 服务器支持的WebSocket协议版本的逗号分隔列表。

Sec-WebSocket-Accept

当服务器愿意发起一个WebSocket连接时,包含在服务器在握手过程中的响应消息中。它将在响应头中出现不超过一次。

Sec-WebSocket-Accept: hash

参考文章


看见了
876 声望16 粉丝

前端开发,略懂后台;


« 上一篇
【算法】栈
下一篇 »
【算法】队列