使用ws包连接Poloniex WebSocket出现MASK must be clear错误
错误含义
RangeError: Invalid WebSocket frame: MASK must be clear属于WebSocket协议校验类错误
- WebSocket RFC6455规范明确要求:客户端向服务端发送的所有帧必须设置掩码位(MASK=1),服务端向客户端返回的所有帧必须不设置掩码位(MASK=0)
- 该错误是ws客户端库检测到接收的服务端返回帧违规设置了掩码位,直接触发协议错误,抛出异常并中断连接,附带的错误码
1002对应WebSocket标准的协议错误码,最终关闭时打印的1006是连接异常断开的状态码。
触发原因
- 根本原因是Poloniex的WebSocket服务端实现存在协议兼容缺陷:当收到携带明确关闭状态码(比如你代码里传的1000)的客户端关闭帧时,服务端返回的关闭确认帧错误添加了掩码,违反了服务端帧不能带掩码的规范,被ws库校验拦截触发报错。
- 调用
ws.close()不传参数时不会报错的原因:无参数调用close方法时,ws库发送的关闭帧不携带状态码,Poloniex服务端针对这类帧返回的确认帧刚好符合无掩码的规范,不会触发校验错误。 - 对接其他同类服务无报错的原因:其他服务的WebSocket实现严格遵守了RFC6455规范,无论收到的关闭帧是否携带状态码,返回给客户端的帧都不会错误设置掩码位。
内容的提问来源于stack exchange,提问作者cj-2307
相关产品推荐
相关产品推荐

