如何使 TCP 套接字超时

如何使 TCP 套接字超时

对于我们服务器环境的网络灾难模拟,我们正在寻找一种故意使 TCP 套接字超时的方法。对于现有的套接字有什么简单的方法吗?此外,小的 C 测试用例程序将是一个优点。

我们已经尝试在 TCP 缓冲区读取期间关闭网络接口,并从断开连接的安装资源 (samba) 中读取。

我们的测试服务器是Ubuntu 12.04.4。

答案1

要导致现有连接超时,您可以使用iptables。只需DROP在要禁用的端口上启用规则即可。因此,要在活动连接建立时模拟 Samaba 服务器超时,请在服务器上执行以下命令:

sudo iptables -A INPUT -p tcp --dport 445 -j DROP

目标DROP不会向数据包的发送者回复RST数据包或错误。ICMP客户端将停止从服务器接收数据包并最终超时。

根据您是否/如何iptables配置,您可能希望将规则插入到INPUT规则集中的更高位置。

答案2

第一个答案是正确的,但我已经发现了这些超时是如何工作的,因此您可以观察和测试它们(不要忘记阻止端口!)。

有 4 个最有趣的处理 TCP 超时的内核参数:

/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/net/ipv4/tcp_keepalive_probes
/proc/sys/net/ipv4/tcp_retries2

现在有2种情况:

  1. 套接字打开并尝试传输 - 然后(如果对方没有响应),系统会重试tcp_retries2多次。使用默认值“retires”时,需要花费超过 2 分钟的时间,并且套接字会超时。

  2. 套接字已打开且空闲 - 那么保活限制很有趣。对于空闲套接字,系统将等待tcp_keepalive_time几秒钟,然后尝试tcp_keepalive_probes以秒为间隔发送 TCP KEEPALIVE tcp_keepalive_intvl。只有在所有失败之后,套接字才会超时。

相关内容