当我关闭浏览器窗口时,我得到这个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"]
答案 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中出现恼人的消息。