Linux服务器重新发送SYN ACK

我正在解决两个Linux机器之间的连接超时问题,在服务器的堆栈上看起来SYN-ACK的ACK已经丢失。

tcpdump在服务器端完成。

客户端得到syn-ack,发送ACK和数据包,并再次发送数据4次。 服务器在发送syn-ack 4秒钟后重新发送syn-ack,表明来自客户端的ACK在服务器堆栈上丢失。 客户端用ACK进行响应。

然后大约3秒后,客户端重新发送数据,并获得服务器的ACK。 客户端在10秒发送了FIN,因为客户端应用程序已经设置了10秒的超时时间。

所以问题是:tcpdump显示ACK到SYN-ACK到达服务器。 在这种情况下服务器可以重新发送SYN-ACK吗? 在服务器端是内核还是应用程序问题? 如何进一步debugging?

感谢你的帮助。


 20:31:01.159098 IP client.cport> server.sport:S 2848162415:2848162415(0)win 5840 
 20:31:01.159103 IP server.sport> client.cport:S 901143055:901143055(0)ack 2848162416 win 5792 
 20:31:01.159192 IP client.cport> server.sport:。  ack 1 win 46 
 20:31:01.159276 IP client.cport> server.sport:P 1:426(425)ack 1 win 46 
 20:31:01.380395 IP client.cport> server.sport:P 1:426(425)ack 1 win 46 
 20:31:01.824367 IP client.cport> server.sport:P 1:426(425)ack 1 win 46 
 20:31:02.712362 IP client.cport> server.sport:P 1:426(425)ack 1 win 46 
 20:31:04.488358 IP client.cport> server.sport:P 1:426(425)ack 1 win 46 
 20:31:05.159038 IP server.sport> client.cport:S 901143055:901143055(0)ack 2848162416 win 5792 
 20:31:05.159157 IP client.cport> server.sport:。  ack 1 win 46 
 20:31:08.040317 IP client.cport> server.sport:P 1:426(425)ack 1 win 46 
 20:31:08.040326 IP server.sport> client.cport:。  ack 426 win 27 
 20:31:11.159618 IP client.cport> server.sport:F 426:426(0)ack 1 win 46 
 20:31:11.199139 IP server.sport> client.cport:。  ack 427 win 27 
 20:31:14.724604 IP server.sport> client.cport:。  1:1449(1448)ack 427 win 27 
 20:31:14.724612 IP server.sport> client.cport:P 1449:1756(307)ack 427 win 27 
 20:31:14.724776 IP client.cport> server.sport:R 2848162842:2848162842(0)win 0
 20:31:14.724779 IP client.cport> server.sport:R 2848162842:2848162842(0)win 0

编辑:有很多溢出。 该应用程序有一个低的listen()积压导致这个问题?

 $ netstat -s |  grep -i列表
     210473次套接字的侦听队列溢出
     210473忽略了听到套接字的SYN

编辑2:这是我的第一篇文章,所以请留在我身边。 🙂

客户端和服务器内核:2.6.18-92.el5

服务器应用程序:只听运动。 它处理客户端请求,并回应。 我使用strace,发现listen()积压是5。

有8个客户端系统,每个系统运行一个客户端应用程序实例。 客户端应用程序将req发送到服务器端口,从服务器获取响应。 客户端成功连接()后设置10s定时器。 每个客户端实例都可以发送多个连接请求,每个请求都在其自己的客户端端口上

可能会有来自8个客户端的并发请求。

编辑3:tcpdump看起来非常类似http://forum.openvz.org/index.php?t=msg&goto=25678 ,但没有根本原因/解决scheme。

我会问自己为什么会正常的客户:

  1. 将之前通告的数据窗口5840收缩至46
  2. 重新发送相同的数据段 5次(1秒内3次!)

另外,如果你需要社区的帮助,你最好以为早已失去了我们的心灵感应能力,所以我们甚至连软件都没有涉及到什么(从Linux内核版本开始)和什么以及它应该如何工作。

您的积压太小,无法接受您的所有请求。 待办事项是接受队列的大小,当接受队列已满时,根据net.ipv4.tcp_abort_on_overflow忽略客户端的ACK或连接被中止。 所以增加你的积压。