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

San*_*ndy 2 tcp

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

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

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

[ACK] seq=1 ack=大的ack号

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

kas*_*erd 5

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

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

客户端将发送SYN,因为它不记得旧连接。服务器将看到SYN到达处于已建立状态的连接,这是出乎意料的。但由于它是一个有效的连接,服务器不能以RST. 相反,它将发送一个ACK对应于服务器已知的当前序列号。

客户端将接收一个ACK尚未建立的连接。每个方向的第一个数据包都需要SYN设置位。因此,客户端知道ACK之前连接的 是 ,并将以RST. 该RST会清除来自服务器的旧连接。

发送完SYNACKRST数据包后,客户端可以重新传输SYN数据包。这次握手将起作用。

首先,旧连接最终处于断开状态有多种可能的原因。这里有几种可能性:

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