4

我们在我们的环境中面临随机 RST 数据包问题,这会导致一些意外行为,下图是 Wireshark 生成的 tcp 数据的快照,它显示了问题:

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

TCP数据包

经过一些分析,我们认为在第3步之后发生了一些网络问题,所以从服务器发送的所有结果数据和FIN信号都没有被客户端确认,但是我们对服务器发送的RST信号感到很困惑。根据我们的理解,如果一个半关闭的套接字接收到一些数据,或者关闭一个套接字时接收队列中有数据,就会发送一个RST信号。但这两者似乎都不是我们案件的根本原因。

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

4

1 回答 1

0

RST通常在close没有 的情况下在套接字上调用时发生shutdown,或者在一段shutdown时间后对方仍在尝试发送数据(仍然没有用 回复FIN)。

一些编程语言有一个socket.close(timeout)例如.NETshutdown ,然后closetimeout通过之后调用。

所以客户端必须timeout完成发送和关闭连接FIN,如果没有完成,连接将被强行关闭RST

请参阅https://stackoverflow.com/a/23483487/1438522close以获取有关和之间区别的更详尽解释shutdown

于 2021-01-22T23:39:43.017 回答