意外的TCP RST数据包

时间:2012-09-25 16:02:56

标签: tcp

我们在环境中遇到随机RST数据包问题,导致一些意外行为,图片是wireshark生成的tcp数据的快照,显示问题:

  1. 客户端(117.136.2.181)成功建立与服务器的连接(192.168.40.16)
  2. 客户端向服务器发送一些数据,以及KEEP_ALIVE信号。
  3. 服务器接收数据,处理数据并将结果发送回客户端。
  4. 服务器关闭套接字。
  5. 服务器不接收来自客户端的ACK信号,因此它重新发送结果数据以及FIN信号,这是由TCP协议自动完成的。但是,服务器仍然没有收到来自客户端的ACK信号。
  6. 服务器向客户端发送RST信号,以便关闭连接。
  7. TCP data packet

    经过一番分析后,我们认为在步骤3之后会出现一些网络问题,因此客户端无法获取服务器发送的所有结果数据和FIN信号,但我们对服务器发送的RST信号非常困惑。根据我们的理解,如果半封闭套接字接收到某些数据,或者当关闭套接字时接收队列中有数据,则发送RST信号。但这些似乎都不是我们案件的根本原因。

    有人可以帮助详细说明为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

RST 通常发生在没有 close 的套接字上调用 shutdown 时,或者在 shutdown 之后,而另一方仍在尝试发送数据(仍然没有回复了 FIN)。

某些编程语言对 example .NET 有一个 socket.close(timeout),它会在 shutdown 过去后调用 closetimeout

所以客户端最多有 timeout 完成发送和关闭与 FIN 的连接,如果没有完成,连接将被 RST 强行关闭。

有关 closeshutdown 之间区别的更详尽说明,请参阅 https://stackoverflow.com/a/23483487/1438522