为什么QWebSocketServer在客户端尝试连接时发送TCP [FIN]消息

时间:2019-03-22 14:39:08

标签: qt tcp websocket

我将QWebSocketServer与Qt5.8一起使用。大多数WebSocket客户端都可以毫无问题地连接到它,但是其中一个引发了独特的行为。

下面是我通过此客户端(客户端10.8.0.1,服务器10.8.0.8)获得的WireShark捕获。

10.8.0.1 10.8.0.8 TCP 44 51331 → 8888 [SYN] Seq=0 Win=2920 Len=0 MSS=1355             
10.8.0.8 10.8.0.1 TCP 44 8888 → 51331 [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1460           
10.8.0.1 10.8.0.8 TCP 40 51331 → 8888 [ACK] Seq=1 Ack=1 Win=2920 Len=0             
10.8.0.1 10.8.0.8 TCP 64 51331 → 8888 [PSH, ACK] Seq=1 Ack=1 Win=2920 Len=24 [TCP segment of a reassembled PDU]      
10.8.0.8 10.8.0.1 TCP 40 8888 → 51331 [ACK] Seq=1 Ack=25 Win=29200 Len=0             
10.8.0.8 10.8.0.1 TCP 40 8888 → 51331 [FIN, ACK] Seq=1 Ack=25 Win=29200 Len=0            
10.8.0.1 10.8.0.8 HTTP 209 GET /example HTTP/1.1                  
10.8.0.8 10.8.0.1 TCP 40 8888 → 51331 [RST] Seq=1 Win=0 Len=0              
10.8.0.1 10.8.0.8 TCP 40 51331 → 8888 [ACK] Seq=194 Ack=2 Win=2919 Len=0             
10.8.0.8 10.8.0.1 TCP 40 8888 → 51331 [RST] Seq=2 Win=0 Len=0              
10.8.0.1 10.8.0.8 TCP 40 51331 → 8888 [FIN, ACK] Seq=194 Ack=2 Win=2919 Len=0            
10.8.0.8 10.8.0.1 TCP 40 8888 → 51331 [RST] Seq=2 Win=0 Len=0 

下面是我从一个正常工作的客户端连接到同一服务器(客户端192.168.1.48,服务器192.168.1.111)获得的WireShark捕获。

192.168.1.48 192.168.1.111 TCP 74 37556 → 8888 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=7880001 TSecr=0 WS=16         
192.168.1.111 192.168.1.48 TCP 74 8888 → 37556 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=3996923817 TSecr=7880001 WS=128       
192.168.1.48 192.168.1.111 TCP 66 37556 → 8888 [ACK] Seq=1 Ack=1 Win=29200 Len=0 TSval=7880013 TSecr=3996923817           
192.168.1.48 192.168.1.111 HTTP 264 GET /example HTTP/1.1                  
192.168.1.111 192.168.1.48 TCP 66 8888 → 37556 [ACK] Seq=1 Ack=199 Win=30080 Len=0 TSval=3996923820 TSecr=7880013           
192.168.1.111 192.168.1.48 HTTP 540 HTTP/1.1 101 Switching Protocols Continuation                
192.168.1.48 192.168.1.111 TCP 66 37556 → 8888 [ACK] Seq=199 Ack=475 Win=30272 Len=0 TSval=7880034 TSecr=3996924025           
192.168.1.48 192.168.1.111 WebSocket 136 WebSocket Text [FIN] [MASKED] 

据我了解,在第一种情况下,我的QWebSocketServer实现在客户端可以发送其HTTP升级获取请求之前,出于我不理解的原因发送[FIN]消息。

这可能是由第一个客户端发送[PSH,ACK] TCP消息而第二个客户端没有发送TCP消息引起的吗?谁不符合此处的WebSocket协议?

1 个答案:

答案 0 :(得分:0)

我刚刚发现了这个Qt bug report来解释我的情况。正如Timur Pocheptsov所说,这似乎是一个已知的错误,需要进行主要的QWebSockets重构才能解决。

  

不幸的是,它是设计使然的:QWebSocketHandshakeRequest尝试解析客户端的握手,除此行外什么都看不到,它认为这样的请求无效,然后QWebsocketServerPrivate :: handshakeReceived关闭连接。为了正确处理此问题,需要在qtwebsockets中进行重大的重写/重新设计。