我正在解决两个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。
我会问自己为什么会正常的客户:
另外,如果你需要社区的帮助,你最好以为早已失去了我们的心灵感应能力,所以我们甚至连软件都没有涉及到什么(从Linux内核版本开始)和什么以及它应该如何工作。
您的积压太小,无法接受您的所有请求。 待办事项是接受队列的大小,当接受队列已满时,根据net.ipv4.tcp_abort_on_overflow忽略客户端的ACK或连接被中止。 所以增加你的积压。