为什么 TCP [RST, ACK] 被忽略?

网络工程 通讯协议
2021-07-12 12:49:31

我有一个 Windows 2008 服务器和一个通过 Internet 连接到它的应用程序。我不时看到我收到一个被我的应用程序忽略的 TCP [RST, ACK]。使用 TCPViewer 我仍然可以看到连接仍然存在。我做了不同的 Wireshark 捕获,我可以看到在 RST 忽略的情况下,另一个数据包被发回,并且连接永远不会被丢弃。

269037  72.5.42.235 172.16.1.138    TCP 60  9003?54020 [RST, ACK] Seq=2655287284 Ack=371936778 Win=0 Len=0
269038  172.16.1.138    72.5.42.235 TCP 66  [TCP Dup ACK 268965#33] 54020?9003 [ACK] Seq=371936778 Ack=2655238984 Win=2097120 Len=0 SLE=2655243124 SRE=2655287284

这通常发生在连接不好并且我有很多延迟、延迟数据包和重传时。有人可以解释应用程序或操作系统可能忽略 [RST, ACK] 时的情况吗?

2个回答

TCP 连接通常使用特殊程序终止,其中每一端独立地关闭其链路末端。连接只是一对双向握手,而不是某些人期望的正常三向握手。正常连接关闭状态在每一端都不同。它通常以应用进程之一向其 TCP 层发送不再需要会话的信号开始。该设备发送一条 FIN 消息告诉其他设备它要结束连接,该消息得到确认。当响应设备准备好时,它也发送一个被确认的 FIN;等待一段时间后收到 ACK,我相信它的 4 分钟,会话关闭。

TCP 协议检测并响应在建立连接期间可能发生的各种问题。最常见的一种是半开连接。当一台设备关闭连接而另一台设备不知道时,就会发生这种情况,这是由于连接存在一些问题,例如网络连接不畅,持续抖动,这听起来像是您遇到的情况。这意味着一个设备处于 ESTABLISHED 状态,而另一个可能处于 CLOSED 状态或其他一些瞬态状态。这会导致两个设备的状态变得不同步。

TCP 使用 RST 重置功能处理这些半开连接,每当 TCP 软件“意外”发生某些事情时就会生成该功能。

您的客户端发出了 RST,您的 http 服务器确认了 RST,这应该已经关闭了连接。但是由于网络震荡,连接半开不同步,造成了一些丢包或者接收乱序。这就是为什么您还会在帖子中看到 DUP ACK。

要关闭整个 TCP 连接,您需要在两端都关闭它。如果一侧从其一侧关闭连接,则另一侧可以根据需要打开该连接。

你可以在这里查看它是如何工作的 http://en.wikipedia.org/wiki/Transmission_Control_Protocol