websocket介绍
-
建立连接过程
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
# Upgrade: websocket |表示希望升级到websocket协议
# Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== |随机生成的base64字符串,用于服务端验证
# Sec-WebSocket-Version: 13 |指定协议版本2.服务端验证请求后返回101 switching protocols响应
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
# Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= |由客户端的 Sec-WebSocket-Key 拼接固定字符串 258EAFA5-E914-47DA-95CA-C5AB0DC85B11,进行 SHA-1 哈希后 Base64 编码生成
# 注意:服务端需设置Access-Controll-Allow-Origin处理跨域问题3.连接升级完成
经过上面的步骤,底层tcp连接已经升级为websocket连接,后续通信采用websocket的"帧协议".
-
websocket的帧状态码
1.标准状态码
1000 CLOSE_NORMAL 正常关闭,连接任务已完成
1001 CLOSE_GOING_AWAY 终端离开(如页面跳转或服务端主动关闭)
1002 CLOSE_PROTOCOL_ERROR 协议错误(如数据格式不符合规范)
1003 CLOSE_UNSUPPORTED 接收到不支持的数据类型(如文本终端收到二进制数据)
1005 CLOSE_NO_STATUS_RECEIVED 保留状态码,表示连接关闭时未收到预期的状态码或错误信息,通常由客户端触发.不会实际发送,只是生成了这个状态码给开发看.
1006 CLOSE_ABNORMAL 连接异常关闭(未发送关闭帧或网络中断)
1007 Unsupported Data 数据格式错误(如非 UTF-8 编码的文本消息)
1008 Policy Violation 违反策略(如数据不符合业务约定)
1009 CLOSE_TOO_LARGE 数据帧过大,超出处理能力
1011 Internal Error 服务端内部错误(如未处理的异常)
1015 TLS Handshake TLS 握手失败(如证书验证不通过)
2.使用中常见的状态码
1000,1001,1005,1006,1015
-
websocket保活
1.应用层
客户端定时发送ping帧给服务端,服务端需立即回复pong帧,需携带与ping相同的应用数据,不可分片,需一次性发送.
2.传输层
tcp keep-alive, 由于websocket依赖tcp协议,所以tcp的保活机制也能检查websocket的活跃性.tcp协议会定时地发送探测包来检查连接是否可用. linux和windows默认都是2小时发送一次,可以修改系统设置来修改这个探测间隔. nginx可以单独设置tcp的可用性检测间隔时间.
推荐只使用第一种方法, 第二种方法不够直接而且还容易引起副作用.
拓展:
除此之外,防火墙/网络设备的设置也可能影响到websocket连接的活跃性,因为它们都有默认的连接静默超时时间,一般来说,用了应用层保活就不会有问题,这里只是提供一个问题排查方向.
-
websocket断开
1.正常断开
客户端主动发送1000状态码帧给服务端,服务端也发送1000状态码帧给客户端,两边断开.
2.客户端离开
用户切换/关闭浏览器标签页时,浏览器会触发相应的请求,发送1001状态码帧给服务端,服务端关闭连接.
通常,在开发中,1000和1001在第三方依赖中是会被一并处理的,两者都属于正常关闭.
3.无状态关闭
未知但未报错的底层中断,状态码是1005,可能是客户端刷新页面引起的.
实际开发中通常不需要主动处理,如果需要可以尝试重连.
4.异常关闭
网络中断或进程崩溃,状态码是1006.
网络中断: 防火墙拦截, 代理超时, tcp探测机制发现超时,防火墙/nginx/网络设备静默检测超时等等情况,这些情况会触发tcp reset(RST),客户端/服务端就能知道连接异常关闭.
进程崩溃:包括服务端和客户端的进程崩溃,进程崩溃时,操作系统回收进程资源会触发tcp reset(RST), 这时不管是客户端/服务端会立即知道连接异常关闭.
浙公网安备 33010602011771号