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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。