我有一个通过HTTP与服务器通信的应用程序。我编写了一个代码来控制连接超时(它在服务器回复之前等待的时间)。但我发现很难生成一个测试用例来测试我的连接超时代码。你能帮我吗?
基本上,TCp握手将包含 主机A向主机B发送TCP SYNchronize数据包
主机B收到A的SYN
主机B发送SYNchronize-acknowledge
主机A接收B的SYN-ACK
主机A发送确认
主机B收到ACK。 TCP套接字连接是ESTABLISHED。
在我的应用程序中,如果服务器在x秒内未完成TCP握手,则应用程序将移至下一个服务器。但是为了测试这段代码,我需要一个服务器存根,它可能会接受来自客户端的SYN数据包,但不会将SYN + ACK数据包设置到客户端。从而使客户端等待服务器的回复。
请你帮我创建一个小服务器存根,它将监听特定端口,但不会完成握手。
答案 0 :(得分:2)
鉴于您提到RHEL,我认为您最好使用iptables
来帮助测试。例如,你可以打电话:
iptables -I INPUT -s hostb -d hosta -p tcp --dport $port --tcp-flags SYN,ACK SYN,ACK -j DROP
在运行测试之前调用它(或者甚至可能在它期间?)和等效的匹配-X来删除它似乎是到目前为止中断握手的最简单方法。
删除所有SYN + ACK(警告,将打破新的SSH连接):
iptables -I INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -j DROP
从10.10.22.34删除所有内容:
iptables -I INPUT -s 10.10.22.34 -j DROP
iptables -I OUTPUT -d 10.10.22.34 -j DROP
就个人而言,我会使用您可能编写的最具体的匹配,以避免意外地同时破坏远程访问或其他任何内容。
您可以变得更加漂亮并使用-m owner
匹配仅将此规则应用于运行此测试的UID的数据包。
答案 1 :(得分:1)
我不会依赖iptables
或任何其他工具进行单元测试,因为这些测试太脆弱了。如果IP地址发生变化,或者单元测试是在另一台机器上运行怎么办?如果代码必须移植到iptables
不可用的操作系统上,该怎么办?
为了使单元测试与网络隔离,我将套接字API封装在Socket类中。然后我会有一个使用Connection
类的Socket
类。我将使用Connection
类(来自TimeoutSocket
)对Socket
类进行单元测试,该类模拟服务器不接受第一个连接请求。
您的代码不应该依赖于线路上发生的事情。