TCP ACK被忽略,重传SYN ACK,为什么?

3
我们不理解这种TCP行为,显示出一个redhat linux 5 TCP堆栈(HTTP服务器,这是从哪里转储的)接收了SYN, ACK的ACK,但继续忽略它并重复5次重复的SYN, ACK。最后,服务器对此“连接”的HTTP GET发送RST。
Time                          Source                Destination           Port   Protocol Length Info
2015-01-30 08:42:18.387260000 81.74.146.89          124.219.82.236        80     TCP      74     64866 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 WS=8 SACK_PERM=1 TSval=988669132 TSecr=0
2015-01-30 08:42:18.387309000 124.219.82.236        81.74.146.89          64866  TCP      62     http > 64866 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460 SACK_PERM=1
2015-01-30 08:42:18.387354000 81.74.146.89          124.219.82.236        80     TCP      60     64866 > http [ACK] Seq=1 Ack=1 Win=5840 Len=0
2015-01-30 08:42:21.386871000 124.219.82.236        81.74.146.89          64866  TCP      62     [TCP Retransmission] http > 64866 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460 SACK_PERM=1
2015-01-30 08:42:21.387118000 81.74.146.89          124.219.82.236        80     TCP      66     [TCP Dup ACK 3#1] 64866 > http [ACK] Seq=1 Ack=1 Win=5840 Len=0 SLE=0 SRE=1
2015-01-30 08:42:27.386919000 124.219.82.236        81.74.146.89          64866  TCP      62     [TCP Retransmission] http > 64866 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460 SACK_PERM=1
2015-01-30 08:42:27.387165000 81.74.146.89          124.219.82.236        80     TCP      66     [TCP Dup ACK 3#2] 64866 > http [ACK] Seq=1 Ack=1 Win=5840 Len=0 SLE=0 SRE=1
2015-01-30 08:42:39.387130000 124.219.82.236        81.74.146.89          64866  TCP      62     [TCP Retransmission] http > 64866 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460 SACK_PERM=1
2015-01-30 08:42:39.387376000 81.74.146.89          124.219.82.236        80     TCP      66     [TCP Dup ACK 3#3] 64866 > http [ACK] Seq=1 Ack=1 Win=5840 Len=0 SLE=0 SRE=1
2015-01-30 08:43:03.387486000 124.219.82.236        81.74.146.89          64866  TCP      62     [TCP Retransmission] http > 64866 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460 SACK_PERM=1
2015-01-30 08:43:03.387709000 81.74.146.89          124.219.82.236        80     TCP      66     [TCP Dup ACK 3#4] 64866 > http [ACK] Seq=1 Ack=1 Win=5840 Len=0 SLE=0 SRE=1
2015-01-30 08:43:51.588227000 124.219.82.236        81.74.146.89          64866  TCP      62     [TCP Retransmission] http > 64866 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460 SACK_PERM=1
2015-01-30 08:43:51.588449000 81.74.146.89          124.219.82.236        80     TCP      66     [TCP Dup ACK 3#5] 64866 > http [ACK] Seq=1 Ack=1 Win=5840 Len=0 SLE=0 SRE=1
2015-01-30 08:57:13.679727000 81.74.146.89          124.219.82.236        80     TCP      353    64866 > http [PSH, ACK] Seq=1 Ack=1 Win=5840 Len=299
2015-01-30 08:57:13.679740000 124.219.82.236        81.74.146.89          64866  TCP      54     http > 64866 [RST] Seq=1 Win=0 Len=0

http://i.stack.imgur.com/5F2ZO.png

pcap: https://www.dropbox.com/s/ave4sctozc5m2a4/TcpAckIgnored.pcapng?dl=0

这个TCP虚假重传的原因是什么?有没有办法进行分析?任何帮助都将不胜感激。

Thomas


你有多确定 ACK 是否真正到达了堆栈?嗅探器是否在主机上运行?你是否可能有一个 IPTables 防火墙规则阻止了 ACK 的传递? - David Hoelzer
是的,嗅探器正在同一主机上运行。但其行为并不稳定,有时会出现问题。我曾经看到过只有2次重传的情况,而在大多数情况下,在这些地址之间它都可以无缝工作。值得一提的是,还安装了一个远程系统日志工具。 - Thomas Kluge
尝试使用“-vv”运行嗅探器,并验证返回的ACK中的校验和是否有效。可能会在某个地方损坏嵌入式协议校验和。这仍然允许其进行路由,但接收主机将会默默丢弃它。这表明在此处和那里之间存在一个网络设备,会间歇性地破坏一些东西。 - David Hoelzer
谢谢!我们会尝试一下。 - Thomas Kluge
IP头部和TCP的校验和都是正确的。netstat -i 没有发现丢失的数据包。iptables -L -v 也没有发现丢失的数据包。 - Thomas Kluge
1
关键字:TCP_DEFER_ACCEPT。更深入的分析请参见:https://labs.ripe.net/Members/gih/the-curious-case-of-the-crooked-tcp-handshake - Vladimír Čunát
3个回答

0

经过进一步调查,我们得出结论,这是一种 Apache 行为,我们可以随时使用以下方法重现:

"telnet 服务器地址 80"

如果我们使用 "nc -l 80" 启动一个简单的 Web 服务器,就不会有重传。

因此,Apache 至少需要一个 TCP PSH 或任何数据包来打开连接。您可以使用 netstat 监视它。


0

这种情况曾经发生在我身上,后来我发现目标主机的子网掩码配置错误(应该是16位而不是24位)。


0

我在重新加载数据库时遇到了同样的问题,所以我找到了这个问题。但看起来我们的原因不同,所以我会在这里发布我的结果,其他遇到此问题的人也可以在这里看到。

在我的情况下,如果我有一个监听端口,而你无法快速接受新的连接,当侦听队列已满时,你将遇到这个重传问题。我有以下测试代码,你可以使用它自行测试。我已在ubuntu12.04上进行了测试,我不确定在其他Linux版本上是否会得到相同的行为。

测试代码

顺便说一下,Apache的行为可能与TCP_DEFER_ACCEPT有关,这在这个问题中提到:tcp-defer-accept的实际应用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接