延迟数据包时的TCP RST数据包

时间:2012-05-26 08:52:58

标签: java linux tcp network-programming

我试图通过在必要时延迟数据包来模拟人工网络条件(被模拟的应用程序是Java应用程序)。

我面临的问题是,应用程序检测到它一段时间没有收到ACK并重新发送。这发生在两端,引起裂变反应。数据包是无序接收的,最终,一方发送一个RST数据包。

我想确保这种情况永远不会发生。我该怎样避免这个?

由于

更新:一些Wireshark捕获会话图像:http://db.tt/fav2sRgLhttp://db.tt/zGXwMubk

3 个答案:

答案 0 :(得分:0)

解决方案取决于仿真的意图。

如果您需要线级保真度,则需要控制整个TCP堆栈来管理时序。相反,如果您希望模拟套接字级别的行为,则可以通过响应保持流不变的零长度段来阻止ACK风暴。

显然,仍然会有TCP段,它们只是不包含任何有效载荷。

观察到帧不按顺序发送是很奇怪的,因为这表明包含大量缓冲的环境。您是通过路由WAN还是单个LAN网段进行测试?

答案 1 :(得分:0)

重新传输尚未到达的数据包是TCP 所做的。足够的无序延迟到达 - 特别是确认 - 会破坏其同步安全边缘并中止。

答案 2 :(得分:0)

听起来你持有超过1秒的数据包,这在网络领域真的很长时间,并不是TCP会满意的。结果的失败级联几乎是您对TCP的期望。

但首先你需要考虑这种类型的延迟是否真的是你想要模仿的。数据包遍历路径的时间(单向),往返时间(返回时间)和应用程序处理和响应所花费的时间(独立于网络堆栈)之间存在很大差异)。

我在network statisticsemulation上撰写了几篇您可能会觉得有用的文章。

免责声明:我为一家生产替代传输协议的公司工作。