服务器发送 ACK 以响应 SYN,从而导致客户端的 TCP 请求重置

服务器发送 ACK 以响应 SYN,从而导致客户端的 TCP 请求重置

我们收到了 TCP 层消息的 7% 重置消息。我们有两组日志。

第一个 Wireshark 日志显示了一个良好的请求和响应。这里客户端回复了同步确认,例如 [syn, ack] seq=0 ack=1
[syn,ack] seq=0 ack=1

第二组日志显示服务器直接回复了SEQ=1,并且ACK的ACK号很大,发帖的客户端向其发送了重置消息。

[ACK] seq=1 ack=大确认数

我们应该在 Linux 服务器上更改哪些服务器设置来更改 ACK 消息,以便这些重置可以停止。

答案1

如果之前的 TCP 连接没有正确关闭,您所看到的就是正常行为。

如果端口号与客户端上完全关闭但仍在服务器上建立的先前连接匹配,则会发生您看到的序列。

客户端将发送SYN,因为它不撤回旧连接。服务器将看到SYN到达已建立状态的连接,这是意料之外的。但由于这是一个有效连接,服务器无法用 进行响应RST。相反,它将发送一个ACK对应于服务器已知的当前序列号的 。

客户端将收到一个ACK尚未建立的连接。每个方向的第一个数据包都需要设置位SYN。因此,客户端知道ACK是用于先前的连接,并将以 进行响应RSTRST将从服务器清除旧连接。

SYN发送完、ACK和数据包后RST,客户端可以重新传输SYN数据包。这次握手将成功。

旧连接最终处于断开状态的原因有很多。以下是几种可能性:

  • 当旧连接关闭时,网络连接中断了几分钟。
  • 客户端机器已重新启动。
  • 建立连接时,其中一个 IP 地址被重新分配给另一台机器。
  • 客户端和服务器之间的某个地方有一个行为不当的中间盒(可能是 NAT 或防火墙)。

相关内容