如何使TCP套接字超时


20

对于服务器环境的网络灾难模拟,我们正在寻找一种故意使TCP套接字超时的方法。现有插座有没有简单的方法?另外,很少的C测试用例程序将是一个加号。

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

测试服务器是Ubuntu 12.04.4。

Answers:


19

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

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

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

根据您是否iptables配置/如何配置,您可能希望将规则插入规则INPUT集的上方。


使用netcat尝试了此操作(以侦听/发送数据),并一直等待...没有超时:/而且我可以确认数据已删除。我什/proc/sys/net/ipv4/tcp_keepalive_time至更改为一个非常小的数字
er453r 2014年

@ er453r尝试启用verbose输出,ncat -v以查看其确切ncat功能。在香草Ubuntu 12.04上安装时,我花了2m7.291s超时
Creek

对-在第一次测试中,我没有通过插座发送任何东西。我终于掌握了超时并在下面详细描述了它们:)
er453r 2014年

16

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

有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

现在有两种情况:

  1. 套接字已打开并尝试传输-然后(如果另一端没有响应),系统重试tcp_retries2时间。如果使用默认值retires,则需要2分钟以上的时间,并且套接字超时。

  2. 套接字已打开并处于空闲状态-保持活动限制很有趣。套接字处于空闲状态时,系统将等待tcp_keepalive_time几秒钟,然后尝试tcp_keepalive_probes时间以tcp_keepalive_intvl秒为间隔发送TCP KEEPALIVE 。并且只有在这一切之后,套接字才会超时。


1
另外,您可以使用netstat -o
er453r
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.