我有一个拥有多个客户端的服务器。模拟网络严重拥堵。我发现服务器在收到三次握手的ACK段后重置了一些TCP连接。但是当网络状况良好时就不会发生这种情况。
我发现三次握手的ACK比SYN-ACK晚约3.5秒收到。 那是因为三次握手SYN-ACK超时吗?如果SYN-ACK超时,为什么不重新发送SYN-ACK。
感谢您提出任何建议。
答案 0 :(得分:0)
这与SYN cookies相关。
当Linux主机收到过多的SYN流量时,它会激活SYN cookies
机制。
当启用SYN cookie时,服务器通过发出包含在TCP sequence
字段中编码的特定数据的SYN-ACK段来应答SYN。在该字段中,它对时间戳,MSS和两个端点(本地和远程IP和端口)的加密哈希以及时间戳进行编码。
这样做是为了使服务器不必存储关于连接的任何内容,它只是发送答案而忘记它。
然后,当客户端回答其ACK时,服务器检查ack字段中的哈希值(客户端的ack是服务器的序列)。如果正确,它将与存储在字段中的数据建立连接。
SYN Cookie解释了服务器在超时后不重新发送SYN-ACK数据包的原因。
但是,为什么在收到ACK后重置?
也许客户端(或服务器)位于修改端口的NAT后面,NAT也会变得拥挤,因此它无法将最终的ACK链接到先前的SYN,并分配新的源端口。当服务器收到它时,它会重置连接(如果启用了SYN cookie,则无关紧要)。
或者服务器进程可能不会以与它们到达的速度相同的速度接受连接,内核队列已经填满,而新的队列就会被丢弃。