socket.close()发送格式错误的数据包



当我关闭浏览器窗口时,我会得到这个关闭数据包(wireshark和libwebockets都能理解)

WebSocket
1... .... = Fin: True
.000 .... = Reserved: 0x00
.... 1000 = Opcode: Connection Close (8)
0... .... = Mask: False
.000 0010 = Payload length: 2
Payload
    Close: 03e9
    Close: Going Away (1001)

当我使用socket.close()(Windows下的最新Chrome)我收到了这个数据包,wireshark和libwebockets都不理解。

WebSocket
1... .... = Fin: True
.000 .... = Reserved: 0x00
.... 1000 = Opcode: Connection Close (8)
1... .... = Mask: True
.000 0000 = Payload length: 0
Masking-Key: 1e45aadf
Payload
    Close: <MISSING>
Unmask Payload
[Dissector bug, protocol WebSocket: tvbuff.c:690: failed assertion "DISSECTOR_ASSERT_NOT_REACHED"]

从技术上讲,实际上没有什么问题。

https://www.rfc-editor.org/rfc/rfc6455#section-5.5.1

关闭框可以包含主体("应用程序数据"部分帧的),指示关闭的原因,例如端点关闭,一个端点也收到了一个帧大,或者端点接收到不符合的帧转换为端点所期望的格式如果有尸体正文的前两个字节必须是一个2字节的无符号整数(in网络字节顺序)表示具有值/代码的状态代码/定义于第7.4节。在2字节整数之后。。。

因此,谷歌Chrome正在发送一个不包含原因的关闭帧,这是合法的。MAY表示可选功能。

所以它不是畸形的,只是很奇怪这很奇怪,因为它是一个没有有效负载的掩码帧,它可以设置掩码位,并为掩码密钥保存4个字节。同样奇怪的是,它在执行socket.close()时包含关闭原因,但在关闭浏览器时没有,尽管这是合法的。

我认为这只是Google Chrome中的行为不一致,但仍然应该在libwebsockets和wireshark中正确处理,因为它符合规范。

尽管socket.close();调用完全有效,但您可能需要尝试socket.close(1000, "Goodbye from client");,以防止Wireshark中出现令人讨厌的消息。

相关内容

  • 没有找到相关文章

最新更新