赞
踩
我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?
因为 HTTP 协议有一个缺陷:通信只能由客户端发起。所以我们如果想要获取
举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息,所以服务器有连续的状态变化,客户端要获知就非常麻烦,我们只能使用轮询的方式去查询。轮询的效率非常低,非常浪费资源,所以websocket就诞生了。
WebSocket在2008年诞生,2011成为国际标准,如今所有浏览器均已支持,Websocket已经广泛应用。其定义在RFC6455
WebSocket的最大特点就是服务器可以向客户端推送消息,是真正的双向平等对话,属于服务器推送技术。其特点如下:

学习协议必然要学习他的协议定义,WebSocket的最小单位是帧,由1个或多个帧组成一条消息。
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 ... | +---------------------------------------------------------------+
掩码键(Masking-key)是由客户端挑选出来的32位的随机数。掩码操作不会影响数据载荷的长度。掩码、反掩码操作都采用如下算法:
首先,假设:
算法描述为: original-octet-i 与 masking-key-octet-j 异或后,得到 transformed-octet-i。
j = i MOD 4
transformed-octet-i = original-octet-i XOR masking-key-octet-j

ws-URI:ws://host:[:port]path[?query]
wss-URI:wss://host:[:port]path[?query]
连接说明:
GET /?encoding=text HTTP/1.1
Host: websocket.taohui.tech
Accept-Encoding: gzip, deflate
Sec-WebSocket-Version: 13
Origin: http://www.websocket.org
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Key: c3SkgVxVCDhVCp69PJFf3A==
Connection: keep-alive, Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
HTTP/1.1 101 Web Socket Protocol Handshake
Server: openresty/1.13.6.2
Date: Mon, 10 Dec 2018 08:14:29 GMT
Connection: upgrade
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Headers: authorization
Access-Control-Allow-Headers: x-websocket-extensions
Access-Control-Allow-Headers: x-websocket-version
Access-Control-Allow-Headers: x-websocket-protocol
Access-Control-Allow-Origin: http://www.websocket.org
Sec-WebSocket-Accept: yA9O5xGLp8SbwCV//OepMPw7pEI=
Upgrade: websocket
A1EEou7Nnq6+BBZoAZqWlg==
Sec-WebSocket-Key
和GUID
拼接,GUID在RFC4122中规定,例如A1EEou7Nnq6+BBZoAZqWlg==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
cT8V7OIhhhL8rbFZgoGjU4DReQ8=
websocket使用ping、pong心跳帧来维持连接
ping帧:opcode=9可以含有数据
pong帧:opcode=A必须与ping帧数据相同
websocket定义了关闭帧,opcode=8,发送关闭帧后,不再发送任何数据,接受到关闭帧后,不再接受任何数据。
错误码 | 含义 |
---|---|
1000 | 正常关闭 |
1001 | 表示浏览器页面跳转或者服务器将要关机 |
1002 | 发现协议错误 |
1003 | 接收到不能处理的数据帧(例如某端不能处理二进制消息) |
1004 | 预留 |
1005 | 预留(不能用在关闭帧里),期望但没有接收到错误码 |
1006 | 预留(不能用在关闭帧里),期望给出非正常关闭的错误码 |
1007 | 消息格式不符合 opcode(例如文本帧里消息没有用 UTF8 编码) |
1008 | 接收到的消息不遵守某些策略(比 1003、1009 更一般的错误) |
1009 | 消息超出能处理的最大长度 |
1010 | 客户端明确需要使用扩展,但服务器没有给出扩展的协商信息 |
1011 | 服务器遇到未知条件不能完成请求 |
1015 | 预留(不能用在关闭帧里),表示 TLS 握手失败 |
Websocket负载设计通常需要加入一层消息分发系统来完成,所以其负载均衡相对HTTP来说会比较复杂。

Chrome根据消息不同外框的颜色不同,分别如下:

https://www.ruanyifeng.com/blog/2017/05/websocket.html
https://www.cnblogs.com/chyingp/p/websocket-deep-in.html
https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket/WebSocket
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。