我有两个linux服务器(让我们将它们命名为A和B),连接到同一个(非托管)交换机.我在两台服务器上都禁用了防火墙(所有表中都没有规则,所有默认策略都设置为ACCEPT).因此,没有什么可以阻止一个服务器发送任何TCP/IP数据包和另一个服务器来接收它们.
现在,在A上,我们运行TCP服务器应用程序,它监听/接受传入的连接,然后在循环中将大量数据发送到连接的客户端.它不会尝试从客户端读取,并且如果/当客户端断开连接时,期望在对套接字执行write()时获得EPIPE错误.
接下来,在BI运行nc(netcat)作为客户端应用程序,连接到A上的服务器应用程序,开始接收数据,几秒钟后我按Ctrl-C中断此连接.
我看到的是,A上的服务器应用程序只是在write()中挂起,它没有获得EPIPE或任何其他错误.
我使用tcpdump跟踪TCP/IP数据包,这是我看到的:
我也尝试在A上运行netcat(所以客户端和服务器应用程序都在同一个物理服务器上运行),这样一切都按预期工作 - 服务器应用程序在我用Ctrl-C中断netcat后立即获得EPIPE.并且tcpdump显示有按预期发送的RST数据包.
那么,在这种情况下可能导致不发送RST的原因是什么?
我正在使用Hardened Gentoo Linux,最新的内核2.6.39-hardened-r8,没有任何特定的sysctl网络相关配置.
注意在这些服务器上存在重要的网络活动,或者netstat -alnp
在任何时刻列出大约5000个tcp连接,这可能有用也可能不重要,我认为大约有1000个连接平均每秒打开和关闭.通常在内核日志中看到这样的东西(但是端口号与上面讨论的服务器应用程序使用的不同):
TCP: Possible SYN flooding on port XXXXX. Sending cookies.
net_ratelimit: 19 callbacks suppressed
Run Code Online (Sandbox Code Playgroud)
以下是TCP会话通常的样子:http://i54.tinypic.com/1zz10mx.jpg