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

时间:2014-10-28 11:07:05

标签: google-chrome websocket

当我关闭浏览器窗口时,我得到这个close-packet(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"]

2 个答案:

答案 0 :(得分:3)

从技术上讲,实际上并没有错。

https://tools.ietf.org/html/rfc6455#section-5.5.1

  

关闭框架可以包含一个主体(“应用程序数据”部分)   (框架)表示关闭的原因,例如   端点关闭,端点也收到了帧   大,或接收到不符合框架的端点   到端点期望的格式。 如果有身体,那么   正文的前两个字节必须是一个2字节的无符号整数(in   网络字节顺序)表示值为/ code /的状态代码   在第7.4节中定义。遵循2字节整数...

因此Google Chrome正在发送一个不含理由的关闭框架,这是合法的。 MAY indicates an optional feature

因此它没有格式错误,只是奇怪。这是奇怪的,因为它是一个没有有效载荷的屏蔽帧,它可以设置屏蔽位,并保存4个字节用于屏蔽键。也很奇怪,因为它包含了执行socket.close()时的结束原因,但在关闭浏览器时却没有,尽管它是合法的。

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

答案 1 :(得分:1)

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