tcp - 收到三次握手的ACK后立即重置TCP

标签 tcp reset

我有一个有多个客户端的服务器。模拟网络拥塞严重。我发现服务器在收到三次握手的 ACK 段后重置了一些 TCP 连接。但是当网络状况良好时不会发生这种情况。

我发现三次握手的ACK比SYN-ACK要晚3.5s左右收到。 是不是因为三次握手SYN-ACK超时?如果SYN-ACK超时,为什么不重新发送SYN-ACK。

感谢您的任何建议。

最佳答案

这看起来与 SYN cookies 有关.

同步 cookie

当 Linux 主机接收到过多的 SYN 流量时,它会激活 SYN cookies 机制。

当启用 SYN cookie 时,服务器通过发出一个 SYN-ACK 段来响应 SYN,其中包含在 TCP sequence 字段中编码的特定数据。在该字段中,它对时间戳、MSS 和两个端点(本地和远程 IP 和端口)的加密哈希以及时间戳进行编码。

这样做是为了让服务器此时不必存储有关连接的任何信息,它只需发送答案并忘记它。

然后,当客户端用它的 ACK 应答时,服务器检查 ack 字段中的散列(客户端的 ack 是服务器的序列)。如果正确,它会创建与存储在该字段中的数据的连接。


SYN cookie 解释了为什么服务器在超时时不重新发送 SYN-ACK 数据包。

但是,为什么收到ACK后就重置呢?

也许客户端(或服务器)位于修改端口的 NAT 后面,并且 NAT 也变得拥塞,因此它无法将最终的 ACK 链接到先前的 SYN,并分配一个新的源端口。当服务器收到它时,它会重置连接(是否启用 SYN cookie 无关紧要)。

或者服务器进程可能没有以连接到达的速度接受连接,内核队列已满,新的队列以这种方式被丢弃。

关于tcp - 收到三次握手的ACK后立即重置TCP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33026669/

相关文章:

swift - 从另一个类重置扩展文件 userdefault

在 Shiny R Studio 中重置动画

javascript - 单击元素外部时重置输入字段

sockets - 在 nginx 中使用 TCP_QUICKACK

我可以使用 tun/tap 和原始套接字制作 "TCP packet modifier"吗?

tcp - Web 服务客户端遇到 'java.net.SocketException: Connection reset'

git - 无法在 merge 过程中软重置 git 存储库,但没有 merge 可以中止

java - java中如何停止或杀死一个线程?

c++ - 没有 htonl/ntohl 的 union 和字节顺序

android - Android TCP/IP MTU 的构建时配置