对于我们服务器环境的网络灾难模拟,我们正在寻找一种故意使 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种情况:
套接字打开并尝试传输 - 然后(如果对方没有响应),系统会重试
tcp_retries2
多次。使用默认值“retires”时,需要花费超过 2 分钟的时间,并且套接字会超时。套接字已打开且空闲 - 那么保活限制很有趣。对于空闲套接字,系统将等待
tcp_keepalive_time
几秒钟,然后尝试tcp_keepalive_probes
以秒为间隔发送 TCP KEEPALIVEtcp_keepalive_intvl
。只有在所有失败之后,套接字才会超时。