【发布时间】:2017-11-06 08:32:44
【问题描述】:
我正在测试 TCP 协议以检查其在链路和节点故障下的可靠性,我想测试如果 ACK 在返回客户端的过程中丢失了怎么办,但是 ACK 响应非常快,我想延迟几秒钟以便断开以太网电缆。 有什么方法可以延迟ACK,或者有什么其他的方法可以达到我的目的吗?
【问题讨论】:
-
测试您的应用程序。不要测试平台。 giys对此进行了测试。不要浪费你的时间。如果您发现平台错误,您将如何处理?
我正在测试 TCP 协议以检查其在链路和节点故障下的可靠性,我想测试如果 ACK 在返回客户端的过程中丢失了怎么办,但是 ACK 响应非常快,我想延迟几秒钟以便断开以太网电缆。 有什么方法可以延迟ACK,或者有什么其他的方法可以达到我的目的吗?
【问题讨论】:
没有任何方法可以告诉您的内核延迟 ACK。如果 ACK 丢失并且从任一方的角度来看连接似乎停止,您可以确定将进行多次重试。
如果您决心测试 TCP/IP,您可以按照您的要求使用 Scapy 之类的工具来构建您自己的简单 TCP/IP 堆栈实现。如果这样做,请务必配置基于主机的防火墙以防止发送 RST 数据包。下面是一个简单的示例,它完成了三向握手以响应对任何端口的 SYN:
#!/usr/bin/python
from scapy.all import *
# My starting sequence number
sequence=100
# Wait for an inbound syn
packets=sniff(filter="tcp[13]&0x02 != 0", count=1, iface="eth0")
syn = packets[0]
my_ack = syn.getlayer("TCP").seq + 1
dest = syn.getlayer("IP").src
sport = syn.getlayer("TCP").dport
dport = syn.getlayer("TCP").sport
target = IP(dst=dest)
tcp_layer = TCP(sport=sport, dport=dport, ack=my_ack, seq=sequence, flags="SA")
response = sr1(target/tcp_layer)
synack = response[0]
target = IP(dst=dest)
tcp_layer=TCP(sport=sport, dport=dport, ack=my_ack, seq=sequence, flags="A")
send(target/tcp_layer)
【讨论】:
您可以尝试使用tc 延迟响应确认(输入数据包)并在 igress 接口上添加延迟。
【讨论】: