什么会导致我的SendMail服务器不确认接收TCP序列?

我的TCP / IP协议栈的知识有点生疏,所以请忍受我….

我有一个CentOS 5.7服务器与SendMail,并看到间歇性超时问题发送电子邮件(特别是较大的电子邮件)到其他远程域。 所有附件或收件人域都不会发生这种情况。 一些。 经过一些扩展的故障排除后,我想我已经缩小到TCP序列没有被确认。

下面是我从我的MTA(fooMTA)上直接收集的数据包捕获的TCP会话细目:

Packet 1 - 11: Standard TCP handshake followed by initial SMTP conversation. No errors. Packet #12 Recipient MTA: TCP sequence 231. Ack 91. Packet #13 FooMTA: TCP sequence 91. Ack 305. Packet #14 FooMTA: TCP sequence 1115. Ack 305. Packet #15 Recipient MTA: TCP sequence 305. Ack 2495. Packet #16 FooMTA: TCP sequence 2495. Ack 305. Packet #17 FooMTA: TCP sequence 5255. Ack 305. Packet #18: Recipient MTA: TCP sequence 305. Ack 5255. Packet #19: FooMTA: TCP sequence 6635. Ack 305. Packet #20: FooMTA: TCP sequence 8015. Ack 305. Packet #21: Recipient MTA: TCP Sequence 305. Ack 8015. Packet #22: FooMTA: TCP Sequence 10775. Ack 305. Packet #23: FooMTA: TCP Sequence 13535. Ack 305. Packet #24: Recipient MTA: TCP sequence 305. Ack 10775 Packet #25: FooMTA: TCP Sequence 14915. Ack 305 

它继续这样做,我的服务器仍然认为它没有收到序列305 …作为回应,远程端最终重新发送以前的数据,认为它从来没有到达。 最终这个差距太大,以至于没有新的数据被发送,远程MTA不停地重传旧的东西。 这有助于指数退避,并最终导致远端放弃。

对我来说奇怪的是,我看到“丢失的”TCP序列(本例中为305)返回到我的服务器(通过直接从fooMTA收集的数据包捕获)。所以我不明白为什么我的服务器一直在问这个问题。

这可能是防火墙相关的? 排除故障的下一步是什么?

试试这个:在你的/etc/sysctl.conf底部添加下面几行:

 net.ipv4.tcp_rmem = 4096 87380 174760 net.ipv4.tcp_wmem = 4096 16384 131072 net.ipv4.tcp_window_scaling = 0 

然后以root身份执行sysctl -p

如果这样做,它绕过这个问题。 它不解决它。 造成这种情况的原因有很多种,从一台不能正确对待TCP Window Scaling的路由器,到一台也受到这个威胁的交换机,甚至是错误的布线。 在某些情况下,我发现了一个奇怪的networking接口设备驱动程序和以上所有的组合。